From c4ab243fa63e76423d44ce3efa91c641c170a6e3 Mon Sep 17 00:00:00 2001 From: milan Date: Fri, 31 Jul 2026 19:25:57 +0000 Subject: [PATCH] fix(ui): only label logs cost and duration a session total when the aggregate exists Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> --- .../RequestLogsTableColumns.test.tsx | 29 +++++++++++++++++++ .../view_logs/RequestLogsTableColumns.tsx | 13 ++++----- 2 files changed, 35 insertions(+), 7 deletions(-) diff --git a/ui/litellm-dashboard/src/components/view_logs/RequestLogsTableColumns.test.tsx b/ui/litellm-dashboard/src/components/view_logs/RequestLogsTableColumns.test.tsx index f099edd249a..0b54f78736d 100644 --- a/ui/litellm-dashboard/src/components/view_logs/RequestLogsTableColumns.test.tsx +++ b/ui/litellm-dashboard/src/components/view_logs/RequestLogsTableColumns.test.tsx @@ -73,6 +73,20 @@ describe("Cost column", () => { expect(screen.queryByText("$0.010000")).not.toBeInTheDocument(); expect(screen.getByText("session total")).toBeInTheDocument(); }); + + it("does not label the per-call spend a session total when the aggregate is unavailable", () => { + renderRows([ + logEntry({ + request_id: "req-session-no-aggregate", + spend: 0.01, + session_id: "sess-1", + session_total_count: 3, + }), + ]); + + expect(screen.getByText("$0.010000")).toBeInTheDocument(); + expect(screen.queryByText("session total")).not.toBeInTheDocument(); + }); }); describe("Duration column", () => { @@ -89,6 +103,21 @@ describe("Duration column", () => { expect(screen.getByText("5.40")).toBeInTheDocument(); expect(screen.queryByText("1.20")).not.toBeInTheDocument(); + expect(screen.getByText("session total")).toBeInTheDocument(); + }); + + it("does not label the per-call duration a session total when the aggregate is unavailable", () => { + renderRows([ + logEntry({ + request_id: "req-no-aggregate", + request_duration_ms: 1200, + session_id: "sess-3", + session_total_count: 3, + }), + ]); + + expect(screen.getByText("1.20")).toBeInTheDocument(); + expect(screen.queryByText("session total")).not.toBeInTheDocument(); }); it("shows the call's own duration for a single-call session", () => { diff --git a/ui/litellm-dashboard/src/components/view_logs/RequestLogsTableColumns.tsx b/ui/litellm-dashboard/src/components/view_logs/RequestLogsTableColumns.tsx index ffdd16e26a9..1bd7c5c8dba 100644 --- a/ui/litellm-dashboard/src/components/view_logs/RequestLogsTableColumns.tsx +++ b/ui/litellm-dashboard/src/components/view_logs/RequestLogsTableColumns.tsx @@ -133,7 +133,8 @@ export const getRequestLogsTableColumns = ({ const mcpCount = log.mcp_tool_call_count || 0; const mcpSpend = log.mcp_tool_call_spend || 0; const isMultiCallSession = (log.session_total_count || 1) > 1; - const spend = isMultiCallSession && log.session_total_spend != null ? log.session_total_spend : log.spend; + const sessionTotalSpend = isMultiCallSession ? log.session_total_spend : undefined; + const spend = sessionTotalSpend ?? log.spend; const money = ( @@ -143,7 +144,7 @@ export const getRequestLogsTableColumns = ({ return (
{spend ? : money} - {isMultiCallSession && session total} + {sessionTotalSpend != null && session total} {mcpCount > 0 && mcpSpend > 0 && ( incl. {getSpendString(mcpSpend)} from {mcpCount} MCP @@ -162,10 +163,8 @@ export const getRequestLogsTableColumns = ({ cell: ({ row }) => { const log = row.original; const isMultiCallSession = (log.session_total_count || 1) > 1; - const ms = - isMultiCallSession && log.session_total_duration_ms != null - ? log.session_total_duration_ms - : log.request_duration_ms; + const sessionTotalMs = isMultiCallSession ? log.session_total_duration_ms : undefined; + const ms = sessionTotalMs ?? log.request_duration_ms; if (ms == null) return -; return (
@@ -173,7 +172,7 @@ export const getRequestLogsTableColumns = ({ content={`${ms}ms`} trigger={{(ms / 1000).toFixed(2)}} /> - {isMultiCallSession && session total} + {sessionTotalMs != null && session total}
); },