diff --git a/litellm/proxy/_experimental/out/404.html b/litellm/proxy/_experimental/out/404/index.html similarity index 100% rename from litellm/proxy/_experimental/out/404.html rename to litellm/proxy/_experimental/out/404/index.html diff --git a/litellm/proxy/_experimental/out/_not-found.html b/litellm/proxy/_experimental/out/_not-found/index.html similarity index 100% rename from litellm/proxy/_experimental/out/_not-found.html rename to litellm/proxy/_experimental/out/_not-found/index.html diff --git a/litellm/proxy/_experimental/out/api-reference.html b/litellm/proxy/_experimental/out/api-reference/index.html similarity index 100% rename from litellm/proxy/_experimental/out/api-reference.html rename to litellm/proxy/_experimental/out/api-reference/index.html diff --git a/litellm/proxy/_experimental/out/experimental/api-playground.html b/litellm/proxy/_experimental/out/experimental/api-playground/index.html similarity index 100% rename from litellm/proxy/_experimental/out/experimental/api-playground.html rename to litellm/proxy/_experimental/out/experimental/api-playground/index.html diff --git a/litellm/proxy/_experimental/out/experimental/budgets.html b/litellm/proxy/_experimental/out/experimental/budgets/index.html similarity index 100% rename from litellm/proxy/_experimental/out/experimental/budgets.html rename to litellm/proxy/_experimental/out/experimental/budgets/index.html diff --git a/litellm/proxy/_experimental/out/experimental/caching.html b/litellm/proxy/_experimental/out/experimental/caching/index.html similarity index 100% rename from litellm/proxy/_experimental/out/experimental/caching.html rename to litellm/proxy/_experimental/out/experimental/caching/index.html diff --git a/litellm/proxy/_experimental/out/experimental/claude-code-plugins.html b/litellm/proxy/_experimental/out/experimental/claude-code-plugins/index.html similarity index 100% rename from litellm/proxy/_experimental/out/experimental/claude-code-plugins.html rename to litellm/proxy/_experimental/out/experimental/claude-code-plugins/index.html diff --git a/litellm/proxy/_experimental/out/experimental/old-usage.html b/litellm/proxy/_experimental/out/experimental/old-usage/index.html similarity index 100% rename from litellm/proxy/_experimental/out/experimental/old-usage.html rename to litellm/proxy/_experimental/out/experimental/old-usage/index.html diff --git a/litellm/proxy/_experimental/out/experimental/prompts.html b/litellm/proxy/_experimental/out/experimental/prompts/index.html similarity index 100% rename from litellm/proxy/_experimental/out/experimental/prompts.html rename to litellm/proxy/_experimental/out/experimental/prompts/index.html diff --git a/litellm/proxy/_experimental/out/experimental/tag-management.html b/litellm/proxy/_experimental/out/experimental/tag-management/index.html similarity index 100% rename from litellm/proxy/_experimental/out/experimental/tag-management.html rename to litellm/proxy/_experimental/out/experimental/tag-management/index.html diff --git a/litellm/proxy/_experimental/out/guardrails.html b/litellm/proxy/_experimental/out/guardrails/index.html similarity index 100% rename from litellm/proxy/_experimental/out/guardrails.html rename to litellm/proxy/_experimental/out/guardrails/index.html diff --git a/litellm/proxy/_experimental/out/login.html b/litellm/proxy/_experimental/out/login/index.html similarity index 100% rename from litellm/proxy/_experimental/out/login.html rename to litellm/proxy/_experimental/out/login/index.html diff --git a/litellm/proxy/_experimental/out/logs.html b/litellm/proxy/_experimental/out/logs/index.html similarity index 100% rename from litellm/proxy/_experimental/out/logs.html rename to litellm/proxy/_experimental/out/logs/index.html diff --git a/litellm/proxy/_experimental/out/mcp/oauth/callback.html b/litellm/proxy/_experimental/out/mcp/oauth/callback/index.html similarity index 100% rename from litellm/proxy/_experimental/out/mcp/oauth/callback.html rename to litellm/proxy/_experimental/out/mcp/oauth/callback/index.html diff --git a/litellm/proxy/_experimental/out/model-hub.html b/litellm/proxy/_experimental/out/model-hub/index.html similarity index 100% rename from litellm/proxy/_experimental/out/model-hub.html rename to litellm/proxy/_experimental/out/model-hub/index.html diff --git a/litellm/proxy/_experimental/out/model_hub.html b/litellm/proxy/_experimental/out/model_hub/index.html similarity index 100% rename from litellm/proxy/_experimental/out/model_hub.html rename to litellm/proxy/_experimental/out/model_hub/index.html diff --git a/litellm/proxy/_experimental/out/model_hub_table.html b/litellm/proxy/_experimental/out/model_hub_table/index.html similarity index 100% rename from litellm/proxy/_experimental/out/model_hub_table.html rename to litellm/proxy/_experimental/out/model_hub_table/index.html diff --git a/litellm/proxy/_experimental/out/models-and-endpoints.html b/litellm/proxy/_experimental/out/models-and-endpoints/index.html similarity index 100% rename from litellm/proxy/_experimental/out/models-and-endpoints.html rename to litellm/proxy/_experimental/out/models-and-endpoints/index.html diff --git a/litellm/proxy/_experimental/out/onboarding.html b/litellm/proxy/_experimental/out/onboarding/index.html similarity index 100% rename from litellm/proxy/_experimental/out/onboarding.html rename to litellm/proxy/_experimental/out/onboarding/index.html diff --git a/litellm/proxy/_experimental/out/organizations.html b/litellm/proxy/_experimental/out/organizations/index.html similarity index 100% rename from litellm/proxy/_experimental/out/organizations.html rename to litellm/proxy/_experimental/out/organizations/index.html diff --git a/litellm/proxy/_experimental/out/playground.html b/litellm/proxy/_experimental/out/playground/index.html similarity index 100% rename from litellm/proxy/_experimental/out/playground.html rename to litellm/proxy/_experimental/out/playground/index.html diff --git a/litellm/proxy/_experimental/out/policies.html b/litellm/proxy/_experimental/out/policies/index.html similarity index 100% rename from litellm/proxy/_experimental/out/policies.html rename to litellm/proxy/_experimental/out/policies/index.html diff --git a/litellm/proxy/_experimental/out/settings/admin-settings.html b/litellm/proxy/_experimental/out/settings/admin-settings/index.html similarity index 100% rename from litellm/proxy/_experimental/out/settings/admin-settings.html rename to litellm/proxy/_experimental/out/settings/admin-settings/index.html diff --git a/litellm/proxy/_experimental/out/settings/logging-and-alerts.html b/litellm/proxy/_experimental/out/settings/logging-and-alerts/index.html similarity index 100% rename from litellm/proxy/_experimental/out/settings/logging-and-alerts.html rename to litellm/proxy/_experimental/out/settings/logging-and-alerts/index.html diff --git a/litellm/proxy/_experimental/out/settings/router-settings.html b/litellm/proxy/_experimental/out/settings/router-settings/index.html similarity index 100% rename from litellm/proxy/_experimental/out/settings/router-settings.html rename to litellm/proxy/_experimental/out/settings/router-settings/index.html diff --git a/litellm/proxy/_experimental/out/settings/ui-theme.html b/litellm/proxy/_experimental/out/settings/ui-theme/index.html similarity index 100% rename from litellm/proxy/_experimental/out/settings/ui-theme.html rename to litellm/proxy/_experimental/out/settings/ui-theme/index.html diff --git a/litellm/proxy/_experimental/out/teams.html b/litellm/proxy/_experimental/out/teams/index.html similarity index 100% rename from litellm/proxy/_experimental/out/teams.html rename to litellm/proxy/_experimental/out/teams/index.html diff --git a/litellm/proxy/_experimental/out/test-key.html b/litellm/proxy/_experimental/out/test-key/index.html similarity index 100% rename from litellm/proxy/_experimental/out/test-key.html rename to litellm/proxy/_experimental/out/test-key/index.html diff --git a/litellm/proxy/_experimental/out/tools/mcp-servers.html b/litellm/proxy/_experimental/out/tools/mcp-servers/index.html similarity index 100% rename from litellm/proxy/_experimental/out/tools/mcp-servers.html rename to litellm/proxy/_experimental/out/tools/mcp-servers/index.html diff --git a/litellm/proxy/_experimental/out/tools/vector-stores.html b/litellm/proxy/_experimental/out/tools/vector-stores/index.html similarity index 100% rename from litellm/proxy/_experimental/out/tools/vector-stores.html rename to litellm/proxy/_experimental/out/tools/vector-stores/index.html diff --git a/litellm/proxy/_experimental/out/usage.html b/litellm/proxy/_experimental/out/usage/index.html similarity index 100% rename from litellm/proxy/_experimental/out/usage.html rename to litellm/proxy/_experimental/out/usage/index.html diff --git a/litellm/proxy/_experimental/out/users.html b/litellm/proxy/_experimental/out/users/index.html similarity index 100% rename from litellm/proxy/_experimental/out/users.html rename to litellm/proxy/_experimental/out/users/index.html diff --git a/litellm/proxy/_experimental/out/virtual-keys.html b/litellm/proxy/_experimental/out/virtual-keys/index.html similarity index 100% rename from litellm/proxy/_experimental/out/virtual-keys.html rename to litellm/proxy/_experimental/out/virtual-keys/index.html diff --git a/litellm/proxy/guardrails/usage_endpoints.py b/litellm/proxy/guardrails/usage_endpoints.py index 16a6f1a2cc5..b5a578815f0 100644 --- a/litellm/proxy/guardrails/usage_endpoints.py +++ b/litellm/proxy/guardrails/usage_endpoints.py @@ -106,9 +106,7 @@ def _aggregate_daily_metrics(metrics: Any, id_attr: str) -> Dict[str, Dict[str, return agg -def _prev_fail_rates( - metrics_prev: Any, id_attr: str -) -> Dict[str, float]: +def _prev_fail_rates(metrics_prev: Any, id_attr: str) -> Dict[str, float]: prev_agg_raw: Dict[str, Dict[str, int]] = {} for m in metrics_prev: gid = getattr(m, id_attr) @@ -137,15 +135,34 @@ def _chart_from_metrics(metrics: Any) -> List[Dict[str, Any]]: ] +def _get_guardrail_attrs(g: Any) -> tuple[Any, str]: + """Get (guardrail_id, display_name) from guardrail - handles Prisma model or dict.""" + gid = getattr(g, "guardrail_id", None) or ( + g.get("guardrail_id") if isinstance(g, dict) else None + ) + name = getattr(g, "guardrail_name", None) or ( + g.get("guardrail_name") if isinstance(g, dict) else None + ) + return gid, (name or gid or "") + + def _guardrail_overview_rows( guardrails: Any, agg: Dict[str, Dict[str, Any]], prev_agg: Dict[str, float], ) -> List[UsageOverviewRow]: rows: List[UsageOverviewRow] = [] + covered_keys: set = set() for g in guardrails: - gid = g.guardrail_id - a = agg.get(gid, {"requests": 0, "passed": 0, "blocked": 0, "flagged": 0}) + gid, display_name = _get_guardrail_attrs(g) + # Metrics are keyed by logical name from spend log metadata; guardrails table uses UUID + lookup_keys = [k for k in (display_name, gid) if k] + covered_keys.update(lookup_keys) + a = {"requests": 0, "passed": 0, "blocked": 0, "flagged": 0} + for k in lookup_keys: + if k in agg: + a = agg[k] + break req, blocked = a["requests"], a["blocked"] fail_rate = (100.0 * blocked / req) if req else 0.0 litellm_params = ( @@ -156,16 +173,16 @@ def _guardrail_overview_rows( (g.guardrail_info or {}) if isinstance(g.guardrail_info, dict) else {} ) gtype = str(guardrail_info.get("type", "Guardrail")) - prev_fail = ( - prev_agg.get(gid, 0.0) - if isinstance(prev_agg.get(gid), (int, float)) - else 0.0 - ) + prev_fail = 0.0 + for k in lookup_keys: + if k in prev_agg: + prev_fail = float(prev_agg.get(k, 0.0) or 0.0) + break trend = _trend_from_comparison(fail_rate, prev_fail) rows.append( UsageOverviewRow( id=gid, - name=g.guardrail_name or gid, + name=display_name or str(gid), type=gtype, provider=provider, requestsEvaluated=req, @@ -176,6 +193,28 @@ def _guardrail_overview_rows( trend=trend, ) ) + # Add rows for guardrails with metrics but not in guardrails table (e.g. MCP, config) + for agg_key, a in agg.items(): + if agg_key in covered_keys or a["requests"] == 0: + continue + req, blocked = a["requests"], a["blocked"] + fail_rate = (100.0 * blocked / req) if req else 0.0 + prev_fail = float(prev_agg.get(agg_key, 0.0) or 0.0) + trend = _trend_from_comparison(fail_rate, prev_fail) + rows.append( + UsageOverviewRow( + id=agg_key, + name=agg_key, + type="Guardrail", + provider="Custom", + requestsEvaluated=req, + failRate=round(fail_rate, 1), + avgScore=None, + avgLatency=None, + status=_status_from_fail_rate(fail_rate), + trend=trend, + ) + ) return rows @@ -411,9 +450,9 @@ def _usage_log_entry_from_row( duration = entry_for_guardrail.get("duration") if duration is not None: latency_val = round(float(duration) * 1000, 0) - score_val = entry_for_guardrail.get("confidence_score") or entry_for_guardrail.get( - "risk_score" - ) + score_val = entry_for_guardrail.get( + "confidence_score" + ) or entry_for_guardrail.get("risk_score") if score_val is not None: score_val = round(float(score_val), 2) resp = entry_for_guardrail.get("guardrail_response") @@ -486,9 +525,7 @@ async def guardrails_usage_logs( return UsageLogsResponse(logs=[], total=0, page=page, page_size=page_size) try: - where = _build_usage_logs_where( - guardrail_id, policy_id, start_date, end_date - ) + where = _build_usage_logs_where(guardrail_id, policy_id, start_date, end_date) index_rows = await prisma_client.db.litellm_spendlogguardrailindex.find_many( where=where, order={"start_time": "desc"}, diff --git a/ui/litellm-dashboard/src/components/GuardrailsMonitor/GuardrailDetail.tsx b/ui/litellm-dashboard/src/components/GuardrailsMonitor/GuardrailDetail.tsx index 9724050276d..ed9f435f9db 100644 --- a/ui/litellm-dashboard/src/components/GuardrailsMonitor/GuardrailDetail.tsx +++ b/ui/litellm-dashboard/src/components/GuardrailsMonitor/GuardrailDetail.tsx @@ -1,17 +1,14 @@ import { ArrowLeftOutlined, - BellOutlined, - PlayCircleOutlined, SafetyOutlined, SettingOutlined, WarningOutlined, } from "@ant-design/icons"; import { useQuery } from "@tanstack/react-query"; -import { Card, Col, Grid, Title } from "@tremor/react"; +import { Col, Grid } from "@tremor/react"; import { Button, Spin, Tabs } from "antd"; import React, { useMemo, useState } from "react"; import { - formatDate, getGuardrailsUsageDetail, getGuardrailsUsageLogs, } from "@/components/networking"; @@ -24,6 +21,8 @@ interface GuardrailDetailProps { guardrailId: string; onBack: () => void; accessToken?: string | null; + startDate: string; + endDate: string; } const statusColors: Record< @@ -35,19 +34,15 @@ const statusColors: Record< critical: { bg: "bg-red-50", text: "text-red-700", dot: "bg-red-500" }, }; -const defaultEnd = new Date(); -const defaultStart = new Date(); -defaultStart.setDate(defaultStart.getDate() - 7); - export function GuardrailDetail({ guardrailId, onBack, accessToken = null, + startDate, + endDate, }: GuardrailDetailProps) { const [activeTab, setActiveTab] = useState("overview"); const [evaluationModalOpen, setEvaluationModalOpen] = useState(false); - const [startDate] = useState(() => formatDate(defaultStart)); - const [endDate] = useState(() => formatDate(defaultEnd)); const [logsPage, setLogsPage] = useState(1); const logsPageSize = 50; @@ -156,23 +151,12 @@ export function GuardrailDetail({ {data.provider} - @@ -223,52 +207,6 @@ export function GuardrailDetail({ - - - Root Cause Analysis - -

Common patterns in failing requests

-
-
- -
-

- High sensitivity to medical terminology -

-

- 34% of blocked requests contain common medical terms (e.g., "symptoms", - "treatment", "medication") that are benign in context. - Consider adding an allowlist or relaxing sensitivity for these categories. -

-
-
-
- -
-

- False positives on educational content -

-

- 22% of blocked requests are educational queries about safety topics. The guardrail - is flagging the topic itself rather than harmful intent. -

-
-
-
- -
-

- Sensitivity may be too aggressive -

-

- Many blocked requests may be false positives. Consider relaxing sensitivity or - adding allowlisted patterns to reduce blocks by ~40% while maintaining safety. -

-
-
-
-
- ({ getGuardrailsUsageOverview: vi.fn(), - getPoliciesUsageOverview: vi.fn(), formatDate: vi.fn((d: Date) => d.toISOString().slice(0, 10)), })); const mockGetGuardrailsUsageOverview = vi.mocked(networking.getGuardrailsUsageOverview); -const mockGetPoliciesUsageOverview = vi.mocked(networking.getPoliciesUsageOverview); function wrapper({ children }: { children: React.ReactNode }) { const queryClient = new QueryClient({ @@ -27,7 +25,7 @@ function wrapper({ children }: { children: React.ReactNode }) { } describe("GuardrailsMonitorView", () => { - it("should render overview and fetch guardrails and policies usage when accessToken is provided", async () => { + it("should render overview and fetch guardrails usage when accessToken is provided", async () => { mockGetGuardrailsUsageOverview.mockResolvedValue({ rows: [], chart: [], @@ -35,13 +33,6 @@ describe("GuardrailsMonitorView", () => { totalBlocked: 0, passRate: 100, }); - mockGetPoliciesUsageOverview.mockResolvedValue({ - rows: [], - chart: [], - totalRequests: 0, - totalBlocked: 0, - passRate: 100, - }); render( , @@ -51,7 +42,6 @@ describe("GuardrailsMonitorView", () => { expect(await screen.findByRole("heading", { name: /Guardrails Monitor/i })).toBeDefined(); await waitFor(() => { expect(mockGetGuardrailsUsageOverview).toHaveBeenCalled(); - expect(mockGetPoliciesUsageOverview).toHaveBeenCalled(); }); }); diff --git a/ui/litellm-dashboard/src/components/GuardrailsMonitor/GuardrailsMonitorView.tsx b/ui/litellm-dashboard/src/components/GuardrailsMonitor/GuardrailsMonitorView.tsx index 7cc2074e468..7214b0642b6 100644 --- a/ui/litellm-dashboard/src/components/GuardrailsMonitor/GuardrailsMonitorView.tsx +++ b/ui/litellm-dashboard/src/components/GuardrailsMonitor/GuardrailsMonitorView.tsx @@ -1,6 +1,9 @@ -import React, { useState } from "react"; -import { GuardrailsOverview } from "./GuardrailsOverview"; +import type { DateRangePickerValue } from "@tremor/react"; +import React, { useCallback, useMemo, useState } from "react"; +import { formatDate } from "@/components/networking"; +import AdvancedDatePicker from "@/components/shared/advanced_date_picker"; import { GuardrailDetail } from "./GuardrailDetail"; +import { GuardrailsOverview } from "./GuardrailsOverview"; type View = | { type: "overview" } @@ -10,9 +13,28 @@ interface GuardrailsMonitorViewProps { accessToken?: string | null; } +const defaultEnd = new Date(); +const defaultStart = new Date(); +defaultStart.setDate(defaultStart.getDate() - 7); + export default function GuardrailsMonitorView({ accessToken = null }: GuardrailsMonitorViewProps) { const [view, setView] = useState({ type: "overview" }); + const initialFrom = useMemo(() => new Date(defaultStart), []); + const initialTo = useMemo(() => new Date(defaultEnd), []); + + const [dateValue, setDateValue] = useState({ + from: initialFrom, + to: initialTo, + }); + + const startDate = dateValue.from ? formatDate(dateValue.from) : ""; + const endDate = dateValue.to ? formatDate(dateValue.to) : ""; + + const handleDateChange = useCallback((newValue: DateRangePickerValue) => { + setDateValue(newValue); + }, []); + const handleSelectGuardrail = (id: string) => { setView({ type: "detail", guardrailId: id }); }; @@ -23,13 +45,28 @@ export default function GuardrailsMonitorView({ accessToken = null }: Guardrails return (
+
+ +
{view.type === "overview" ? ( - + ) : ( )}
diff --git a/ui/litellm-dashboard/src/components/GuardrailsMonitor/GuardrailsOverview.tsx b/ui/litellm-dashboard/src/components/GuardrailsMonitor/GuardrailsOverview.tsx index 6aef6a9e0ad..fc3801484e0 100644 --- a/ui/litellm-dashboard/src/components/GuardrailsMonitor/GuardrailsOverview.tsx +++ b/ui/litellm-dashboard/src/components/GuardrailsMonitor/GuardrailsOverview.tsx @@ -1,7 +1,5 @@ import { DownloadOutlined, - FileTextOutlined, - PlayCircleOutlined, RiseOutlined, SafetyOutlined, SettingOutlined, @@ -11,12 +9,8 @@ import { useQuery } from "@tanstack/react-query"; import { Card, Col, Grid, Title } from "@tremor/react"; import { Button, Spin, Table } from "antd"; import type { ColumnsType } from "antd/es/table"; -import React, { useEffect, useMemo, useState } from "react"; -import { - getGuardrailsUsageOverview, - getPoliciesUsageOverview, -} from "@/components/networking"; -import { formatDate } from "@/components/networking"; +import React, { useMemo, useState } from "react"; +import { getGuardrailsUsageOverview } from "@/components/networking"; import { type PerformanceRow } from "./mockData"; import { EvaluationSettingsModal } from "./EvaluationSettingsModal"; import { MetricCard } from "./MetricCard"; @@ -24,10 +18,11 @@ import { ScoreChart } from "./ScoreChart"; interface GuardrailsOverviewProps { accessToken?: string | null; + startDate: string; + endDate: string; onSelectGuardrail: (id: string) => void; } -type ViewMode = "guardrails" | "policies"; type SortKey = | "failRate" | "requestsEvaluated" @@ -58,46 +53,25 @@ function computeMetricsFromRows(data: PerformanceRow[]) { return { totalRequests, totalBlocked, passRate, avgLatency, count: data.length }; } -type RerunState = "idle" | "running" | "done"; - -const defaultEnd = new Date(); -const defaultStart = new Date(); -defaultStart.setDate(defaultStart.getDate() - 7); - export function GuardrailsOverview({ accessToken = null, + startDate, + endDate, onSelectGuardrail, }: GuardrailsOverviewProps) { - const [viewMode, setViewMode] = useState("guardrails"); const [sortBy, setSortBy] = useState("failRate"); const [sortDir, setSortDir] = useState<"asc" | "desc">("desc"); - const [rerunState, setRerunState] = useState("idle"); const [evaluationModalOpen, setEvaluationModalOpen] = useState(false); - const [startDate, setStartDate] = useState(() => formatDate(defaultStart)); - const [endDate, setEndDate] = useState(() => formatDate(defaultEnd)); const { data: guardrailsData, isLoading: guardrailsLoading, error: guardrailsError } = useQuery({ queryKey: ["guardrails-usage-overview", startDate, endDate], queryFn: () => getGuardrailsUsageOverview(accessToken!, startDate, endDate), enabled: !!accessToken, }); - const { data: policiesData, isLoading: policiesLoading, error: policiesError } = useQuery({ - queryKey: ["policies-usage-overview", startDate, endDate], - queryFn: () => getPoliciesUsageOverview(accessToken!, startDate, endDate), - enabled: !!accessToken, - }); - useEffect(() => { - if (rerunState !== "done") return; - const t = setTimeout(() => setRerunState("idle"), 4000); - return () => clearTimeout(t); - }, [rerunState]); - - const activeData: PerformanceRow[] = viewMode === "guardrails" - ? (guardrailsData?.rows ?? []) - : (policiesData?.rows ?? []); + const activeData: PerformanceRow[] = guardrailsData?.rows ?? []; const metrics = useMemo(() => { - if (viewMode === "guardrails" && guardrailsData) { + if (guardrailsData) { return { totalRequests: guardrailsData.totalRequests ?? 0, totalBlocked: guardrailsData.totalBlocked ?? 0, @@ -106,18 +80,9 @@ export function GuardrailsOverview({ count: activeData.length, }; } - if (viewMode === "policies" && policiesData) { - return { - totalRequests: policiesData.totalRequests ?? 0, - totalBlocked: policiesData.totalBlocked ?? 0, - passRate: String(policiesData.passRate ?? 0), - avgLatency: activeData.length ? Math.round(activeData.reduce((s, r) => s + (r.avgLatency ?? 0), 0) / activeData.length) : 0, - count: activeData.length, - }; - } return computeMetricsFromRows(activeData); - }, [viewMode, guardrailsData, policiesData, activeData]); - const chartData = viewMode === "guardrails" ? guardrailsData?.chart : policiesData?.chart; + }, [guardrailsData, activeData]); + const chartData = guardrailsData?.chart; const sorted = useMemo(() => { return [...activeData].sort((a, b) => { const mult = sortDir === "desc" ? -1 : 1; @@ -126,14 +91,12 @@ export function GuardrailsOverview({ return (Number(aVal) - Number(bVal)) * mult; }); }, [activeData, sortBy, sortDir]); - const isLoading = viewMode === "guardrails" ? guardrailsLoading : policiesLoading; - const error = viewMode === "guardrails" ? guardrailsError : policiesError; - - const isGuardrails = viewMode === "guardrails"; + const isLoading = guardrailsLoading; + const error = guardrailsError; const columns: ColumnsType = [ { - title: isGuardrails ? "Guardrail" : "Policy", + title: "Guardrail", dataIndex: "name", key: "name", render: (name: string, row) => ( @@ -236,12 +199,6 @@ export function GuardrailsOverview({ } }; - const handleRerun = () => { - if (rerunState !== "idle") return; - setRerunState("running"); - setTimeout(() => setRerunState("done"), 2500); - }; - return (
@@ -251,50 +208,16 @@ export function GuardrailsOverview({

Guardrails Monitor

- {isGuardrails - ? "Monitor guardrail performance across all requests" - : "Monitor policy enforcement across all requests"} + Monitor guardrail performance across all requests

- - {startDate} – {endDate} -
-
- - -
- @@ -330,7 +253,7 @@ export function GuardrailsOverview({ @@ -350,12 +273,10 @@ export function GuardrailsOverview({
- {isGuardrails ? "Guardrail Performance" : "Policy Performance"} + Guardrail Performance

- {isGuardrails - ? "Click a guardrail to view details, logs, and configuration" - : "Click a policy to view details, logs, and configuration"} + Click a guardrail to view details, logs, and configuration

@@ -365,9 +286,6 @@ export function GuardrailsOverview({ onClick={() => setEvaluationModalOpen(true)} title="Evaluation settings" /> -
= { "vector-stores": "Manage vector databases for embeddings", new_usage: "View usage analytics and metrics", logs: "Access request and response logs", - "guardrails-monitor": "Monitor guardrail and policy performance and view logs", + "guardrails-monitor": "Monitor guardrail performance and view logs", users: "Manage internal user accounts and permissions", teams: "Create and manage teams for access control", organizations: "Manage organizations and their members",