-
setUsageView(value)} isAdmin={isAdmin} />
+ setUsageView(value)}
+ isAdmin={isAdmin}
+ canViewTagUsage={canViewTagUsage}
+ />
{paginatedResult.isFetchingMore && (
diff --git a/ui/litellm-dashboard/src/components/UsagePage/components/UsageViewSelect/UsageViewSelect.test.tsx b/ui/litellm-dashboard/src/components/UsagePage/components/UsageViewSelect/UsageViewSelect.test.tsx
index 7bb80b424b5..b33129fcdb4 100644
--- a/ui/litellm-dashboard/src/components/UsagePage/components/UsageViewSelect/UsageViewSelect.test.tsx
+++ b/ui/litellm-dashboard/src/components/UsagePage/components/UsageViewSelect/UsageViewSelect.test.tsx
@@ -110,4 +110,16 @@ describe("UsageViewSelect", () => {
expect(mockOnChange).toHaveBeenCalledWith("team");
});
+
+ it("should show Tag Usage for non-admin users with tag usage permission", () => {
+ render(
);
+
+ expect(screen.getByRole("option", { name: "Tag Usage" })).toBeInTheDocument();
+ });
+
+ it("should hide Tag Usage for non-admin users without tag usage permission", () => {
+ render(
);
+
+ expect(screen.queryByRole("option", { name: "Tag Usage" })).not.toBeInTheDocument();
+ });
});
diff --git a/ui/litellm-dashboard/src/components/UsagePage/components/UsageViewSelect/UsageViewSelect.tsx b/ui/litellm-dashboard/src/components/UsagePage/components/UsageViewSelect/UsageViewSelect.tsx
index 11fdb8a7cf5..184fc000274 100644
--- a/ui/litellm-dashboard/src/components/UsagePage/components/UsageViewSelect/UsageViewSelect.tsx
+++ b/ui/litellm-dashboard/src/components/UsagePage/components/UsageViewSelect/UsageViewSelect.tsx
@@ -16,6 +16,7 @@ export interface UsageViewSelectProps {
value: UsageOption;
onChange: (value: UsageOption) => void;
isAdmin: boolean;
+ canViewTagUsage?: boolean;
title?: string;
description?: string;
"data-id"?: string;
@@ -106,12 +107,16 @@ export const UsageViewSelect: React.FC
= ({
value,
onChange,
isAdmin,
+ canViewTagUsage = false,
title = "Usage View",
description = "Select the usage data you want to view",
"data-id": dataId,
}) => {
const getFilteredOptions = () => {
return OPTIONS.filter((option) => {
+ if (option.value === "tag" && canViewTagUsage) {
+ return true;
+ }
if (option.adminOnly && !isAdmin) {
return false;
}
diff --git a/ui/litellm-dashboard/src/utils/roles.ts b/ui/litellm-dashboard/src/utils/roles.ts
index 11e31fd369c..bb23985d7c2 100644
--- a/ui/litellm-dashboard/src/utils/roles.ts
+++ b/ui/litellm-dashboard/src/utils/roles.ts
@@ -5,7 +5,7 @@ export const old_admin_roles = ["Admin", "Admin Viewer"];
export const v2_admin_role_names = ["proxy_admin", "proxy_admin_viewer", "org_admin"];
export const all_admin_roles = [...old_admin_roles, ...v2_admin_role_names];
-export const internalUserRoles = ["Internal User", "Internal Viewer"];
+export const internalUserRoles = ["Internal User", "Internal Viewer", "internal_user", "internal_user_viewer"];
export const rolesAllowedToSeeUsage = ["Admin", "Admin Viewer", "Internal User", "Internal Viewer"];
export const rolesWithWriteAccess = ["Internal User", "Admin", "proxy_admin"];
// Admin-tier read parity: Admin Viewer sees Models + Endpoints, Agents, and