diff --git a/ui/litellm-dashboard/src/components/view_logs/index.tsx b/ui/litellm-dashboard/src/components/view_logs/index.tsx index 218f1caa9ae..5d45d50151b 100644 --- a/ui/litellm-dashboard/src/components/view_logs/index.tsx +++ b/ui/litellm-dashboard/src/components/view_logs/index.tsx @@ -1,12 +1,13 @@ import moment from "moment"; import { useQuery } from "@tanstack/react-query"; import { useState, useRef, useEffect } from "react"; +import { useQueryClient } from "@tanstack/react-query"; import { uiSpendLogsCall } from "../networking"; import { DataTable } from "./table"; import { columns, LogEntry } from "./columns"; import { Row } from "@tanstack/react-table"; - +import { prefetchLogDetails } from "./prefetch"; interface SpendLogsTableProps { accessToken: string | null; token: string | null; @@ -22,6 +23,11 @@ interface PaginatedResponse { total_pages: number; } +interface PrefetchedLog { + messages: any[]; + response: any; +} + export default function SpendLogsTable({ accessToken, token, @@ -54,6 +60,8 @@ export default function SpendLogsTable({ const [selectedKeyHash, setSelectedKeyHash] = useState(""); const [selectedFilter, setSelectedFilter] = useState("Team ID"); + const queryClient = useQueryClient(); + // Close dropdown when clicking outside useEffect(() => { function handleClickOutside(event: MouseEvent) { @@ -105,13 +113,13 @@ export default function SpendLogsTable({ }; } - // Convert times to UTC before formatting const formattedStartTime = moment(startTime).utc().format("YYYY-MM-DD HH:mm:ss"); const formattedEndTime = isCustomDate ? moment(endTime).utc().format("YYYY-MM-DD HH:mm:ss") : moment().utc().format("YYYY-MM-DD HH:mm:ss"); - return await uiSpendLogsCall( + // Get base response from API + const response = await uiSpendLogsCall( accessToken, selectedKeyHash || undefined, selectedTeamId || undefined, @@ -121,6 +129,30 @@ export default function SpendLogsTable({ currentPage, pageSize ); + + // Trigger prefetch for all logs + await prefetchLogDetails( + response.data, + formattedStartTime, + accessToken, + queryClient + ); + + // Update logs with prefetched data if available + response.data = response.data.map((log: LogEntry) => { + const prefetchedData = queryClient.getQueryData( + ["logDetails", log.request_id, formattedStartTime] + ); + + if (prefetchedData?.messages && prefetchedData?.response) { + log.messages = prefetchedData.messages; + log.response = prefetchedData.response; + return log; + } + return log; + }); + + return response; }, enabled: !!accessToken && !!token && !!userRole && !!userID, refetchInterval: 5000,