diff --git a/ui/litellm-dashboard/src/app/(dashboard)/models-and-endpoints/components/AccessGroupBudgetColumns.tsx b/ui/litellm-dashboard/src/app/(dashboard)/models-and-endpoints/components/AccessGroupBudgetColumns.tsx index 5dd6bcacbe1..c51c4ca1490 100644 --- a/ui/litellm-dashboard/src/app/(dashboard)/models-and-endpoints/components/AccessGroupBudgetColumns.tsx +++ b/ui/litellm-dashboard/src/app/(dashboard)/models-and-endpoints/components/AccessGroupBudgetColumns.tsx @@ -16,6 +16,9 @@ import { import { cn } from "@/lib/cva.config"; import { ModelAccessGroup } from "@/app/(dashboard)/hooks/modelAccessGroups/useModelAccessGroups"; +const budgetDecimals = (maxBudget: number | null | undefined): number => + maxBudget != null && maxBudget > 0 && maxBudget < 0.01 ? 5 : 2; + interface AccessGroupRowActionsProps { accessGroup: ModelAccessGroup; onSetBudget: (accessGroup: ModelAccessGroup) => void; @@ -101,7 +104,11 @@ export const getAccessGroupBudgetColumns = ({ size: 180, enableSorting: true, cell: ({ row }) => ( - + ), }, { diff --git a/ui/litellm-dashboard/src/app/(dashboard)/models-and-endpoints/page.tsx b/ui/litellm-dashboard/src/app/(dashboard)/models-and-endpoints/page.tsx index 4f8c05bfa0d..5594bd6211d 100644 --- a/ui/litellm-dashboard/src/app/(dashboard)/models-and-endpoints/page.tsx +++ b/ui/litellm-dashboard/src/app/(dashboard)/models-and-endpoints/page.tsx @@ -9,6 +9,7 @@ import { useUISettings } from "@/app/(dashboard)/hooks/uiSettings/useUISettings" import { all_admin_roles, internalUserRoles } from "@/utils/roles"; import { canCreateModels } from "@/utils/modelPermissions"; import BetaBadge from "@/components/BetaBadge"; +import NewBadge from "@/components/common_components/NewBadge"; import CostOptimizationFeedbackBanner from "@/components/molecules/cost_optimization_feedback_banner"; import ModelInfoView from "@/components/model_info_view"; import TeamInfoView from "@/components/team/TeamInfo"; @@ -48,7 +49,7 @@ const TAB_LABELS: Record = { health: "Health Status", "retry-settings": "Model Retry Settings", "model-group-alias": "Model Group Alias", - "access-group-budgets": "Access Group Budgets", + "access-group-budgets": "Model Access Group Budgets", "price-data": "Price Data Reload", }; @@ -131,6 +132,13 @@ export default function ModelsAndEndpointsPage() { ); } + if (slug === "access-group-budgets") { + return ( + + {TAB_LABELS[slug]} + + ); + } return TAB_LABELS[slug]; }; diff --git a/ui/litellm-dashboard/src/app/(dashboard)/models-and-endpoints/panels/AccessGroupBudgetsPanel.integration.test.tsx b/ui/litellm-dashboard/src/app/(dashboard)/models-and-endpoints/panels/AccessGroupBudgetsPanel.integration.test.tsx index 96b710a7a26..1342e85b669 100644 --- a/ui/litellm-dashboard/src/app/(dashboard)/models-and-endpoints/panels/AccessGroupBudgetsPanel.integration.test.tsx +++ b/ui/litellm-dashboard/src/app/(dashboard)/models-and-endpoints/panels/AccessGroupBudgetsPanel.integration.test.tsx @@ -66,6 +66,15 @@ describe("AccessGroupBudgetsPanel", () => { expect(GET).toHaveBeenCalledWith("/access_group/list"); }); + it("keeps a sub-cent budget readable instead of rounding it away to $0.00", async () => { + GET.mockResolvedValue({ + data: { access_groups: [{ ...BUDGETED_GROUP, budget: { ...BUDGETED_GROUP.budget, max_budget: 0.00002 } }] }, + }); + renderPanel(); + + expect(await screen.findByText("of $0.00002")).toBeInTheDocument(); + }); + it("shows a group with no budget as unlimited and offers nothing to clear", async () => { renderPanel();