+
+
+
+
+
Compression
+
+
+ Configure prompt compression so you pay for fewer input tokens
+
+
+
Headroom prompt compression
@@ -80,7 +90,8 @@ const PromptCompressionTab: React.FC = ({ accessToken
Headroom is a native LiteLLM guardrail that compresses your prompts before they reach the model, so you pay
- for fewer input tokens. The tokens it removes are priced and shown on the Usage tab as compression savings.{" "}
+ for fewer input tokens. The tokens it removes are priced and shown as compression savings on the Cost
+ Optimization dashboard.{" "}
= ({ accessToken
Add Headroom compression guardrail
-
-
-
-
-
-
-
-
-
-
);
};
-export default PromptCompressionTab;
+export default CompressionView;
diff --git a/ui/litellm-dashboard/src/app/(dashboard)/cost-optimization/_components/helpers.test.ts b/ui/litellm-dashboard/src/app/(dashboard)/compression/_components/helpers.test.ts
similarity index 100%
rename from ui/litellm-dashboard/src/app/(dashboard)/cost-optimization/_components/helpers.test.ts
rename to ui/litellm-dashboard/src/app/(dashboard)/compression/_components/helpers.test.ts
diff --git a/ui/litellm-dashboard/src/app/(dashboard)/cost-optimization/_components/helpers.ts b/ui/litellm-dashboard/src/app/(dashboard)/compression/_components/helpers.ts
similarity index 100%
rename from ui/litellm-dashboard/src/app/(dashboard)/cost-optimization/_components/helpers.ts
rename to ui/litellm-dashboard/src/app/(dashboard)/compression/_components/helpers.ts
diff --git a/ui/litellm-dashboard/src/app/(dashboard)/compression/page.tsx b/ui/litellm-dashboard/src/app/(dashboard)/compression/page.tsx
new file mode 100644
index 00000000000..3f4feddf674
--- /dev/null
+++ b/ui/litellm-dashboard/src/app/(dashboard)/compression/page.tsx
@@ -0,0 +1,9 @@
+"use client";
+
+import CompressionView from "./_components/CompressionView";
+import useAuthorized from "@/app/(dashboard)/hooks/useAuthorized";
+
+export default function CompressionPage() {
+ const { accessToken } = useAuthorized();
+ return ;
+}
diff --git a/ui/litellm-dashboard/src/app/(dashboard)/cost-optimization/_components/CostOptimizationView.activity.test.tsx b/ui/litellm-dashboard/src/app/(dashboard)/cost-optimization/_components/CostOptimizationView.activity.test.tsx
index ca7adf07941..176ccbd05ea 100644
--- a/ui/litellm-dashboard/src/app/(dashboard)/cost-optimization/_components/CostOptimizationView.activity.test.tsx
+++ b/ui/litellm-dashboard/src/app/(dashboard)/cost-optimization/_components/CostOptimizationView.activity.test.tsx
@@ -26,8 +26,6 @@ vi.mock("@/app/(dashboard)/router-settings/_components/general_settings", () =>
PromptCachingPanel: () =>
,
}));
-vi.mock("./PromptCompressionTab", () => ({ __esModule: true, default: () =>
}));
-
import CostOptimizationView from "./CostOptimizationView";
const singlePage = {
diff --git a/ui/litellm-dashboard/src/app/(dashboard)/cost-optimization/_components/CostOptimizationView.test.tsx b/ui/litellm-dashboard/src/app/(dashboard)/cost-optimization/_components/CostOptimizationView.test.tsx
index 42dc7719144..c8d8d6e16f9 100644
--- a/ui/litellm-dashboard/src/app/(dashboard)/cost-optimization/_components/CostOptimizationView.test.tsx
+++ b/ui/litellm-dashboard/src/app/(dashboard)/cost-optimization/_components/CostOptimizationView.test.tsx
@@ -2,7 +2,6 @@ import { fireEvent, render } from "@testing-library/react";
import { describe, expect, it, vi } from "vitest";
vi.mock("./UsageTab", () => ({ __esModule: true, default: () =>
}));
-vi.mock("./PromptCompressionTab", () => ({ __esModule: true, default: () =>
}));
vi.mock("./PromptCachingTab", () => ({ __esModule: true, default: () =>
}));
import CostOptimizationView from "./CostOptimizationView";
@@ -10,12 +9,12 @@ import CostOptimizationView from "./CostOptimizationView";
const renderView = () => render( );
describe("CostOptimizationView", () => {
- it("renders the three cost-optimization tabs and no autorouter tab", () => {
+ it("renders the reporting tabs, with compression config moved to its own page", () => {
const { getByText, queryByText } = renderView();
expect(getByText("Usage")).toBeInTheDocument();
- expect(getByText("Prompt Compression")).toBeInTheDocument();
expect(getByText("Prompt Caching")).toBeInTheDocument();
+ expect(queryByText("Prompt Compression")).not.toBeInTheDocument();
expect(queryByText("Autorouter")).not.toBeInTheDocument();
});
@@ -23,11 +22,11 @@ describe("CostOptimizationView", () => {
const { getByRole } = renderView();
expect(getByRole("tab", { name: "Usage" })).toHaveAttribute("aria-selected", "true");
- expect(getByRole("tab", { name: "Prompt Compression" })).toHaveAttribute("aria-selected", "false");
+ expect(getByRole("tab", { name: "Prompt Caching" })).toHaveAttribute("aria-selected", "false");
- fireEvent.click(getByRole("tab", { name: "Prompt Compression" }));
+ fireEvent.click(getByRole("tab", { name: "Prompt Caching" }));
expect(getByRole("tab", { name: "Usage" })).toHaveAttribute("aria-selected", "false");
- expect(getByRole("tab", { name: "Prompt Compression" })).toHaveAttribute("aria-selected", "true");
+ expect(getByRole("tab", { name: "Prompt Caching" })).toHaveAttribute("aria-selected", "true");
});
});
diff --git a/ui/litellm-dashboard/src/app/(dashboard)/cost-optimization/_components/CostOptimizationView.tsx b/ui/litellm-dashboard/src/app/(dashboard)/cost-optimization/_components/CostOptimizationView.tsx
index f6593e80999..8eeee999bfb 100644
--- a/ui/litellm-dashboard/src/app/(dashboard)/cost-optimization/_components/CostOptimizationView.tsx
+++ b/ui/litellm-dashboard/src/app/(dashboard)/cost-optimization/_components/CostOptimizationView.tsx
@@ -5,7 +5,6 @@ import { PiggyBank } from "lucide-react";
import { Alert, Tabs } from "antd";
import UsageTab from "./UsageTab";
-import PromptCompressionTab from "./PromptCompressionTab";
import PromptCachingTab from "./PromptCachingTab";
import { useDailyActivityRange } from "./useDailyActivityRange";
@@ -24,11 +23,6 @@ const CostOptimizationView: React.FC = ({ accessToken
label: "Usage",
children: ,
},
- {
- key: "compression",
- label: "Prompt Compression",
- children: ,
- },
{
key: "caching",
label: "Prompt Caching",
@@ -44,8 +38,8 @@ const CostOptimizationView: React.FC = ({ accessToken
Cost Optimization
- Track and configure the mechanisms that save you money: prompt compression and prompt caching. Auto routers
- live under Models + Endpoints, on the Auto-Routers tab
+ Track what the money-saving mechanisms are actually saving you. Prompt compression is configured under AI
+ Gateway, on the Compression page; auto routers live under Models + Endpoints, on the Auto-Routers tab
diff --git a/ui/litellm-dashboard/src/components/leftnav.test.tsx b/ui/litellm-dashboard/src/components/leftnav.test.tsx
index dc893643559..c6512f81170 100644
--- a/ui/litellm-dashboard/src/components/leftnav.test.tsx
+++ b/ui/litellm-dashboard/src/components/leftnav.test.tsx
@@ -106,6 +106,7 @@ describe("Sidebar (leftnav)", () => {
"Agentic",
"MCP Servers",
"Guardrails",
+ "Compression",
"Policies",
"Tools",
"Usage",
@@ -286,6 +287,10 @@ describe("getBreadcrumb", () => {
expect(getBreadcrumb("logs")).toEqual({ section: "Observability", title: "Logs" });
});
+ it("resolves compression as a top-level AI Gateway page", () => {
+ expect(getBreadcrumb("compression")).toEqual({ section: "AI Gateway", title: "Compression" });
+ });
+
it("resolves a nested child page to its parent section", () => {
expect(getBreadcrumb("search-tools")).toEqual({ section: "AI Gateway", title: "Search Tools" });
});
diff --git a/ui/litellm-dashboard/src/components/leftnav.tsx b/ui/litellm-dashboard/src/components/leftnav.tsx
index af76fccf9eb..b91b7d9f133 100644
--- a/ui/litellm-dashboard/src/components/leftnav.tsx
+++ b/ui/litellm-dashboard/src/components/leftnav.tsx
@@ -53,6 +53,7 @@ import {
Settings as SettingsIcon,
Shield,
ShieldCheck,
+ Shrink,
Tags,
Terminal,
User,
@@ -152,6 +153,13 @@ const menuGroups: MenuGroup[] = [
{ key: "mcp-servers", page: "mcp-servers", label: "MCP Servers", icon: