import { createFileRoute } from '@tanstack/react-router' import { useEffect, useState } from 'react' import { useHardware } from '@/hooks/useHardware' import { getHardwareInfo, getSystemUsage } from '@/services/hardware' import { Progress } from '@/components/ui/progress' import type { HardwareData } from '@/hooks/useHardware' import { route } from '@/constants/routes' import { formatMegaBytes } from '@/lib/utils' import { IconDeviceDesktopAnalytics } from '@tabler/icons-react' import { getActiveModels, stopModel } from '@/services/models' import { Button } from '@/components/ui/button' import { useTranslation } from '@/i18n/react-i18next-compat' import { toNumber } from '@/utils/number' // eslint-disable-next-line @typescript-eslint/no-explicit-any export const Route = createFileRoute(route.systemMonitor as any)({ component: SystemMonitor, }) function SystemMonitor() { const { t } = useTranslation() const { hardwareData, systemUsage, setHardwareData, updateSystemUsage } = useHardware() const [activeModels, setActiveModels] = useState([]) useEffect(() => { // Initial data fetch getHardwareInfo().then((data) => { setHardwareData(data as unknown as HardwareData) }) getActiveModels().then(setActiveModels) // Set up interval for real-time updates const intervalId = setInterval(() => { getSystemUsage().then((data) => { // setHardwareData(data as unknown as HardwareData) updateSystemUsage(data) }) getActiveModels().then(setActiveModels) }, 5000) return () => clearInterval(intervalId) }, [setHardwareData, setActiveModels, updateSystemUsage]) const stopRunningModel = (modelId: string) => { stopModel(modelId) .then(() => { setActiveModels((prevModels) => prevModels.filter((model) => model !== modelId) ) }) .catch((error) => { console.error('Error stopping model:', error) }) } // Calculate RAM usage percentage const ramUsagePercentage = toNumber( (hardwareData.total_memory - systemUsage.used_memory) / hardwareData.total_memory ) * 100 return (

{t('system-monitor:title')}

{/* CPU Usage Card */}

{t('system-monitor:cpuUsage')}

{t('system-monitor:model')} {hardwareData.cpu.name}
{t('system-monitor:cores')} {hardwareData.cpu.core_count}
{t('system-monitor:architecture')} {hardwareData.cpu.arch}
{t('system-monitor:currentUsage')} {systemUsage.cpu.toFixed(2)}%
{/* RAM Usage Card */}

{t('system-monitor:memoryUsage')}

{t('system-monitor:totalRam')} {formatMegaBytes(hardwareData.total_memory)}
{t('system-monitor:availableRam')} {formatMegaBytes( hardwareData.total_memory - systemUsage.used_memory )}
{t('system-monitor:usedRam')} {formatMegaBytes( hardwareData.total_memory - systemUsage.used_memory )}
{t('system-monitor:currentUsage')} {ramUsagePercentage.toFixed(2)}%
{/* Current Active Model Section */}

{t('system-monitor:runningModels')}

{activeModels.length === 0 && (
{t('system-monitor:noRunningModels')}
)} {activeModels.length > 0 && (
{activeModels.map((model) => (
{model}
{t('system-monitor:provider')} llama.cpp
{t('system-monitor:uptime')} {/* {model.start_time && formatDuration(model.start_time)} */}
{t('system-monitor:actions')}
))}
)}
{/* Active GPUs Section */}

{t('system-monitor:activeGpus')}

{hardwareData.gpus.length > 0 ? (
{hardwareData.gpus // .filter((gpu) => gpu.activated) .map((gpu, index) => (
{gpu.name}
{t('system-monitor:active')}
{t('system-monitor:vramUsage')} {formatMegaBytes( gpu.total_memory - systemUsage.gpus[index]?.used_memory )}{' '} / {formatMegaBytes(gpu.total_memory)}
{t('system-monitor:driverVersion')} {gpu.driver_version || '-'}
{t('system-monitor:computeCapability')} {gpu.nvidia_info?.compute_capability || gpu.vulkan_info.api_version}
))}
) : (
{t('system-monitor:noGpus')}
)}
) }