"use client"; import { useState, useEffect, useCallback } from "react"; import Card from "@/shared/components/Card"; import Button from "@/shared/components/Button"; import Drawer from "@/shared/components/Drawer"; import Pagination from "@/shared/components/Pagination"; import { cn } from "@/shared/utils/cn"; import { AI_PROVIDERS, getProviderByAlias } from "@/shared/constants/providers"; let providerNameCache = null; let providerNodesCache = null; async function fetchProviderNames() { if (providerNameCache && providerNodesCache) { return { providerNameCache, providerNodesCache }; } const nodesRes = await fetch("/api/provider-nodes"); const nodesData = await nodesRes.json(); const nodes = nodesData.nodes || []; providerNodesCache = {}; for (const node of nodes) { providerNodesCache[node.id] = node.name; } providerNameCache = { ...AI_PROVIDERS, ...providerNodesCache }; return { providerNameCache, providerNodesCache }; } function getProviderName(providerId, cache) { if (!providerId) return providerId; if (!cache) return providerId; const cached = cache[providerId]; if (typeof cached === 'string') { return cached; } if (cached?.name) { return cached.name; } const providerConfig = getProviderByAlias(providerId) || AI_PROVIDERS[providerId]; return providerConfig?.name || providerId; } function CollapsibleSection({ title, children, defaultOpen = false, icon = null }) { const [isOpen, setIsOpen] = useState(defaultOpen); return (
{isOpen && (
{children}
)}
); } function getInputTokens(tokens) { const prompt = tokens?.prompt_tokens || tokens?.input_tokens || 0; const cache = tokens?.cached_tokens || tokens?.cache_read_input_tokens || 0; return prompt < cache ? cache : prompt; } export default function RequestDetailsTab() { const [details, setDetails] = useState([]); const [pagination, setPagination] = useState({ page: 1, pageSize: 20, totalItems: 0, totalPages: 0 }); const [loading, setLoading] = useState(false); const [selectedDetail, setSelectedDetail] = useState(null); const [isDrawerOpen, setIsDrawerOpen] = useState(false); const [providers, setProviders] = useState([]); const [providerNameCache, setProviderNameCache] = useState(null); const [filters, setFilters] = useState({ provider: "", startDate: "", endDate: "" }); const fetchProviders = useCallback(async () => { try { const res = await fetch("/api/usage/providers"); const data = await res.json(); setProviders(data.providers || []); const cache = await fetchProviderNames(); setProviderNameCache(cache.providerNameCache); } catch (error) { console.error("Failed to fetch providers:", error); } }, []); const fetchDetails = useCallback(async () => { setLoading(true); try { const params = new URLSearchParams({ page: pagination.page.toString(), pageSize: pagination.pageSize.toString() }); if (filters.provider) params.append("provider", filters.provider); if (filters.startDate) params.append("startDate", filters.startDate); if (filters.endDate) params.append("endDate", filters.endDate); const res = await fetch(`/api/usage/request-details?${params}`); const data = await res.json(); setDetails(data.details || []); setPagination(prev => ({ ...prev, ...data.pagination })); } catch (error) { console.error("Failed to fetch request details:", error); } finally { setLoading(false); } }, [pagination.page, pagination.pageSize, filters]); useEffect(() => { fetchProviders(); }, [fetchProviders]); useEffect(() => { fetchDetails(); }, [fetchDetails]); const handleViewDetail = (detail) => { setSelectedDetail(detail); setIsDrawerOpen(true); }; const handlePageChange = (newPage) => { setPagination(prev => ({ ...prev, page: newPage })); }; const handlePageSizeChange = (newPageSize) => { setPagination(prev => ({ ...prev, pageSize: newPageSize, page: 1 })); }; const handleClearFilters = () => { setFilters({ provider: "", startDate: "", endDate: "" }); }; return (
setFilters({ ...filters, startDate: e.target.value })} className={cn( "h-9 px-3 rounded-lg border border-black/10 dark:border-white/10 bg-surface", "w-full min-w-0 text-sm text-text-main focus:outline-none focus:ring-2 focus:ring-primary/20" )} />
setFilters({ ...filters, endDate: e.target.value })} className={cn( "h-9 px-3 rounded-lg border border-black/10 dark:border-white/10 bg-surface", "w-full min-w-0 text-sm text-text-main focus:outline-none focus:ring-2 focus:ring-primary/20" )} />
{loading ? ( ) : details.length === 0 ? ( ) : ( details.map((detail, index) => ( )) )}
Timestamp Model Provider Input Tokens Output Tokens Latency Action
progress_activity Loading...
No request details found
{new Date(detail.timestamp).toLocaleString()} {detail.model} {getProviderName(detail.provider, providerNameCache)} {getInputTokens(detail.tokens).toLocaleString()} {detail.tokens?.completion_tokens?.toLocaleString() || 0}
TTFT: {detail.latency?.ttft || 0}ms
Total: {detail.latency?.total || 0}ms
{!loading && details.length > 0 && (
)}
setIsDrawerOpen(false)} title="Request Details" width="lg" > {selectedDetail && (
ID:{" "} {selectedDetail.id}
Timestamp:{" "} {new Date(selectedDetail.timestamp).toLocaleString()}
Provider:{" "} {getProviderName(selectedDetail.provider, providerNameCache)}
Model:{" "} {selectedDetail.model}
Status:{" "} {selectedDetail.status}
Latency:{" "} TTFT {selectedDetail.latency?.ttft || 0}ms / Total {selectedDetail.latency?.total || 0}ms
Input Tokens:{" "} {getInputTokens(selectedDetail.tokens).toLocaleString()}
Output Tokens:{" "} {selectedDetail.tokens?.completion_tokens?.toLocaleString() || 0}
                  {JSON.stringify(selectedDetail.request, null, 2)}
                
{selectedDetail.providerRequest && (
                    {JSON.stringify(selectedDetail.providerRequest, null, 2)}
                  
)} {selectedDetail.providerResponse && (
                    {typeof selectedDetail.providerResponse === 'object'
                      ? JSON.stringify(selectedDetail.providerResponse, null, 2)
                      : selectedDetail.providerResponse
                    }
                  
)} {selectedDetail.response?.thinking && (

psychology Thinking Process

                      {selectedDetail.response.thinking}
                    
)}

Content

                  {selectedDetail.response?.content || "[No content]"}
                
)}
); }