From c47120cbf73629d9275cde21041694c466309737 Mon Sep 17 00:00:00 2001 From: yassin Date: Sun, 13 Sep 2026 10:31:35 +0000 Subject: [PATCH] fix(proxy): add tpd_limit to deleted token table and fix CI fixtures Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> --- .../migrations/20260913000000_add_tpd_limit/migration.sql | 3 +++ litellm-proxy-extras/litellm_proxy_extras/schema.prisma | 1 + litellm/proxy/management_endpoints/organization_endpoints.py | 1 + litellm/proxy/schema.prisma | 1 + schema.prisma | 1 + .../proxy/management_endpoints/test_customer_endpoints.py | 1 + .../app/(dashboard)/budgets/_components/BudgetTable.test.tsx | 5 ++--- 7 files changed, 10 insertions(+), 3 deletions(-) diff --git a/litellm-proxy-extras/litellm_proxy_extras/migrations/20260913000000_add_tpd_limit/migration.sql b/litellm-proxy-extras/litellm_proxy_extras/migrations/20260913000000_add_tpd_limit/migration.sql index 298fbb5c241..cdf8f4975c1 100644 --- a/litellm-proxy-extras/litellm_proxy_extras/migrations/20260913000000_add_tpd_limit/migration.sql +++ b/litellm-proxy-extras/litellm_proxy_extras/migrations/20260913000000_add_tpd_limit/migration.sql @@ -9,3 +9,6 @@ ALTER TABLE "LiteLLM_DeletedTeamTable" ADD COLUMN IF NOT EXISTS "tpd_limit" BIGI -- AlterTable ALTER TABLE "LiteLLM_VerificationToken" ADD COLUMN IF NOT EXISTS "tpd_limit" BIGINT; + +-- AlterTable +ALTER TABLE "LiteLLM_DeletedVerificationToken" ADD COLUMN IF NOT EXISTS "tpd_limit" BIGINT; diff --git a/litellm-proxy-extras/litellm_proxy_extras/schema.prisma b/litellm-proxy-extras/litellm_proxy_extras/schema.prisma index f4ff9113d76..8072df5aa5b 100644 --- a/litellm-proxy-extras/litellm_proxy_extras/schema.prisma +++ b/litellm-proxy-extras/litellm_proxy_extras/schema.prisma @@ -538,6 +538,7 @@ model LiteLLM_DeletedVerificationToken { blocked Boolean? tpm_limit BigInt? rpm_limit BigInt? + tpd_limit BigInt? max_budget Float? budget_duration String? budget_reset_at DateTime? diff --git a/litellm/proxy/management_endpoints/organization_endpoints.py b/litellm/proxy/management_endpoints/organization_endpoints.py index 96e946424bd..c6a76a920f6 100644 --- a/litellm/proxy/management_endpoints/organization_endpoints.py +++ b/litellm/proxy/management_endpoints/organization_endpoints.py @@ -362,6 +362,7 @@ async def new_organization( - max_budget: *Optional[float]* - Max budget for org - tpm_limit: *Optional[int]* - Max tpm limit for org - rpm_limit: *Optional[int]* - Max rpm limit for org + - tpd_limit: *Optional[int]* - Max tokens per day stored on the org budget. Batch submissions enforce tpd_limit at the key, team and end user scopes only. - model_rpm_limit: *Optional[Dict[str, int]]* - The RPM (Requests Per Minute) limit per model for this organization. - model_tpm_limit: *Optional[Dict[str, int]]* - The TPM (Tokens Per Minute) limit per model for this organization. - max_parallel_requests: *Optional[int]* - [Not Implemented Yet] Max parallel requests for org diff --git a/litellm/proxy/schema.prisma b/litellm/proxy/schema.prisma index f4ff9113d76..8072df5aa5b 100644 --- a/litellm/proxy/schema.prisma +++ b/litellm/proxy/schema.prisma @@ -538,6 +538,7 @@ model LiteLLM_DeletedVerificationToken { blocked Boolean? tpm_limit BigInt? rpm_limit BigInt? + tpd_limit BigInt? max_budget Float? budget_duration String? budget_reset_at DateTime? diff --git a/schema.prisma b/schema.prisma index f4ff9113d76..8072df5aa5b 100644 --- a/schema.prisma +++ b/schema.prisma @@ -538,6 +538,7 @@ model LiteLLM_DeletedVerificationToken { blocked Boolean? tpm_limit BigInt? rpm_limit BigInt? + tpd_limit BigInt? max_budget Float? budget_duration String? budget_reset_at DateTime? diff --git a/tests/test_litellm/proxy/management_endpoints/test_customer_endpoints.py b/tests/test_litellm/proxy/management_endpoints/test_customer_endpoints.py index bd59a82cbd2..9ce3a6fb4c2 100644 --- a/tests/test_litellm/proxy/management_endpoints/test_customer_endpoints.py +++ b/tests/test_litellm/proxy/management_endpoints/test_customer_endpoints.py @@ -743,6 +743,7 @@ _EXPECTED_CUSTOMER = { "max_parallel_requests": None, "tpm_limit": None, "rpm_limit": None, + "tpd_limit": None, "model_max_budget": None, "budget_duration": "30d", "allowed_models": [], diff --git a/ui/litellm-dashboard/src/app/(dashboard)/budgets/_components/BudgetTable.test.tsx b/ui/litellm-dashboard/src/app/(dashboard)/budgets/_components/BudgetTable.test.tsx index 15fef13f23b..ae898645de4 100644 --- a/ui/litellm-dashboard/src/app/(dashboard)/budgets/_components/BudgetTable.test.tsx +++ b/ui/litellm-dashboard/src/app/(dashboard)/budgets/_components/BudgetTable.test.tsx @@ -152,9 +152,8 @@ describe("BudgetTable", () => { }); it("should show n/a for missing rate limits and Unlimited for a missing max budget", () => { - const list = makeList({ - rows: [makeBudget({ max_budget: null, tpm_limit: null, rpm_limit: null, tpd_limit: null })], - }); + const noLimits = { max_budget: null, tpm_limit: null, rpm_limit: null, tpd_limit: null }; + const list = makeList({ rows: [makeBudget(noLimits)] }); renderWithProviders(); expect(screen.getAllByText("n/a")).toHaveLength(3); expect(screen.getByText("Unlimited")).toBeInTheDocument();