import { useState } from 'react' import { type ColumnDef } from '@tanstack/react-table' import { Route, CircleAlert, Sparkles } from 'lucide-react' import { useTranslation } from 'react-i18next' import { formatBillingCurrencyFromUSD } from '@/lib/currency' import { formatUseTime, formatLogQuota, formatTimestampToDate, } from '@/lib/format' import { cn } from '@/lib/utils' import { Button } from '@/components/ui/button' import { Popover, PopoverContent, PopoverTrigger, } from '@/components/ui/popover' import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, } from '@/components/ui/tooltip' import { DataTableColumnHeader } from '@/components/data-table' import { StatusBadge, type StatusBadgeProps, dotColorMap, textColorMap, } from '@/components/status-badge' import type { UsageLog } from '../../data/schema' import { getTimeColor, formatModelName, getTieredBillingSummary, parseLogOther, isViolationFeeLog, } from '../../lib/format' import { isDisplayableLogType, isTimingLogType, getLogTypeConfig, isPerCallBilling, } from '../../lib/utils' import type { LogOtherData } from '../../types' import { DetailsDialog } from '../dialogs/details-dialog' import { useUsageLogsContext } from '../usage-logs-provider' import { CacheTooltip } from './column-helpers' interface DetailSegment { text: string muted?: boolean danger?: boolean } function formatRatioCompact(ratio: number | undefined): string { if (ratio == null || !Number.isFinite(ratio)) return '-' return ratio % 1 === 0 ? String(ratio) : ratio.toFixed(4) } function buildDetailSegments( log: UsageLog, other: LogOtherData | null, t: (key: string, opts?: Record) => string ): DetailSegment[] { if (log.type === 6) { return [{ text: t('Async task refund') }] } if (log.type !== 2) return [] const isViolation = isViolationFeeLog(other) if (isViolation) { const segments: DetailSegment[] = [] segments.push({ text: t('Violation Fee'), danger: true }) if (other?.violation_fee_code) { segments.push({ text: other.violation_fee_code, muted: true, }) } segments.push({ text: `${t('Fee')}: ${formatLogQuota(other?.fee_quota ?? log.quota)}`, muted: true, }) return segments } if (!other) return [] const segments: DetailSegment[] = [] const userGroupRatio = other.user_group_ratio const groupRatio = other.group_ratio const isUserGroup = userGroupRatio != null && Number.isFinite(userGroupRatio) && userGroupRatio !== -1 const effectiveRatio = isUserGroup ? userGroupRatio : groupRatio const ratioLabel = isUserGroup ? t('User Exclusive Ratio') : t('Group Ratio') if (effectiveRatio != null && Number.isFinite(effectiveRatio)) { segments.push({ text: `${ratioLabel} ${formatRatioCompact(effectiveRatio)}x`, }) } const priceOpts = { digitsLarge: 4, digitsSmall: 6, abbreviate: false } const tieredSummary = getTieredBillingSummary(other) if (tieredSummary) { if (tieredSummary.tier.label) { segments.push({ text: `${t('Tier')} ${tieredSummary.tier.label}`, muted: true, }) } for (const entry of tieredSummary.priceEntries) { segments.push({ text: `${t(entry.shortLabel)} ${formatBillingCurrencyFromUSD(entry.price, priceOpts)}/M`, muted: true, }) } } else { const isPerCall = isPerCallBilling(other.model_price) if (isPerCall) { segments.push({ text: `${t('Model Price')} ${formatBillingCurrencyFromUSD(other.model_price!, priceOpts)}`, muted: true, }) } else if (other.model_ratio != null) { const inputPriceUSD = other.model_ratio * 2.0 segments.push({ text: `${t('Input')} ${formatBillingCurrencyFromUSD(inputPriceUSD, priceOpts)}/M`, muted: true, }) } } if (other.is_system_prompt_overwritten) { segments.push({ text: t('System Prompt Override'), danger: true, }) } return segments } export function useCommonLogsColumns(isAdmin: boolean): ColumnDef[] { const { t } = useTranslation() const columns: ColumnDef[] = [ { accessorKey: 'created_at', header: ({ column }) => ( ), cell: ({ row }) => { const log = row.original const timestamp = row.getValue('created_at') as number const config = getLogTypeConfig(log.type) return (
{formatTimestampToDate(timestamp)} {log.request_id && ( 18 ? `${log.request_id.slice(0, 18)}…` : log.request_id } variant='neutral' size='sm' copyText={log.request_id} className='max-w-[140px] truncate font-mono' /> )}
) }, filterFn: (row, _id, value) => { if (!value || value.length === 0) return true return value.includes(String(row.original.type)) }, enableHiding: false, meta: { label: t('Time') }, }, ] if (isAdmin) { columns.push({ id: 'source', header: ({ column }) => ( ), cell: function SourceCell({ row }) { const { setAffinityTarget, setAffinityDialogOpen, setSelectedUserId, setUserInfoDialogOpen, } = useUsageLogsContext() const log = row.original if (!isDisplayableLogType(log.type)) return null const other = parseLogOther(log.other) const affinity = other?.admin_info?.channel_affinity const useChannel = other?.admin_info?.use_channel const channelChain = useChannel && useChannel.length > 0 ? useChannel.join(' → ') : undefined const channelDisplay = log.channel_name ? `${log.channel_name} #${log.channel}` : `#${log.channel}` return (
{affinity && ( )}

{channelDisplay}

{channelChain && (

{t('Chain')}: {channelChain}

)} {affinity && (

{t('Channel Affinity')}

{t('Rule')}: {affinity.rule_name || '-'}

{t('Group')}:{' '} {affinity.using_group || affinity.selected_group || '-'}

)}
{log.username && ( )}
) }, meta: { label: t('Source'), mobileHidden: true }, }) } columns.push( { accessorKey: 'model_name', header: ({ column }) => ( ), cell: function ModelCell({ row }) { const log = row.original if (!isDisplayableLogType(log.type)) return null const modelInfo = formatModelName(log) const tokenName = log.token_name const other = parseLogOther(log.other) let group = log.group if (!group) group = other?.group || '' const modelBadge = modelInfo.isMapped ? (
{t('Request Model:')} {modelInfo.name}
{t('Actual Model:')} {modelInfo.actualModel}
) : ( ) const metaParts: string[] = [] if (tokenName) metaParts.push(tokenName) if (group) metaParts.push(group) return (
{modelBadge} {metaParts.length > 0 && ( {metaParts.join(' · ')} )}
) }, meta: { label: t('Model'), mobileTitle: true }, }, { accessorKey: 'use_time', header: ({ column }) => ( ), cell: ({ row }) => { const log = row.original if (!isTimingLogType(log.type)) return null const useTime = row.getValue('use_time') as number const other = parseLogOther(log.other) const frt = other?.frt const timeVariant = getTimeColor(useTime) const frtVariant = frt ? getTimeColor(frt / 1000) : null return (
{log.is_stream ? t('Stream') : t('Non-stream')} {log.is_stream && other?.stream_status && other.stream_status.status !== 'ok' && (

{t('Stream Status')}: {t('Error')}

{other.stream_status.end_reason || 'unknown'}

{(other.stream_status.error_count ?? 0) > 0 && (

{t('Soft Errors')}:{' '} {other.stream_status.error_count}

)}
)}
) }, meta: { label: t('Timing'), mobileHidden: true }, }, { accessorKey: 'prompt_tokens', header: ({ column }) => ( ), cell: ({ row }) => { const log = row.original if (!isDisplayableLogType(log.type)) return null const other = parseLogOther(log.other) if (isPerCallBilling(other?.model_price)) { return - } const promptTokens = log.prompt_tokens || 0 if (promptTokens === 0) { return - } const cacheReadTokens = other?.cache_tokens || 0 return (
{promptTokens.toLocaleString()} {cacheReadTokens > 0 && ( {t('Cache Read')} {cacheReadTokens.toLocaleString()} )}
) }, meta: { label: t('Input'), mobileHidden: true }, }, { accessorKey: 'completion_tokens', header: ({ column }) => ( ), cell: ({ row }) => { const log = row.original if (!isDisplayableLogType(log.type)) return null const other = parseLogOther(log.other) if (isPerCallBilling(other?.model_price)) { return - } const completionTokens = log.completion_tokens || 0 if (completionTokens === 0) { return - } const cacheWrite5m = other?.cache_creation_tokens_5m || 0 const cacheWrite1h = other?.cache_creation_tokens_1h || 0 const hasSplitCache = cacheWrite5m > 0 || cacheWrite1h > 0 const cacheWriteTokens = hasSplitCache ? cacheWrite5m + cacheWrite1h : other?.cache_creation_tokens || 0 return (
{completionTokens.toLocaleString()} {cacheWriteTokens > 0 && ( {hasSplitCache ? `${t('Cache Write')} ${cacheWrite5m.toLocaleString()}/${cacheWrite1h.toLocaleString()}` : `${t('Cache Write')} ${cacheWriteTokens.toLocaleString()}`} )}
) }, meta: { label: t('Output'), mobileHidden: true }, }, { accessorKey: 'quota', header: ({ column }) => ( ), cell: ({ row }) => { const log = row.original if (!isDisplayableLogType(log.type)) return null const quota = row.getValue('quota') as number const other = parseLogOther(log.other) const isSubscription = other?.billing_source === 'subscription' if (isSubscription) { return (
{t('Deducted by subscription')}: {formatLogQuota(quota)}
) } return (
{formatLogQuota(quota)} {(() => { const userGroupRatio = other?.user_group_ratio if ( userGroupRatio != null && userGroupRatio !== -1 && Number.isFinite(userGroupRatio) ) { return ( {t('User Group: {{ratio}}x', { ratio: userGroupRatio })} ) } const groupRatio = other?.group_ratio if (groupRatio != null && groupRatio !== 1) { return ( {t('Group: {{ratio}}x', { ratio: groupRatio })} ) } return null })()}
) }, meta: { label: t('Cost') }, }, { accessorKey: 'content', header: t('Details'), cell: function DetailsCell({ row }) { const [dialogOpen, setDialogOpen] = useState(false) const log = row.original const other = parseLogOther(log.other) const segments = buildDetailSegments(log, other, t) return ( <> ) }, meta: { label: t('Details'), mobileHidden: true }, size: 200, maxSize: 220, } ) return columns }