import React, { useState } from 'react'; import { Button } from '@/components/ui/button'; import { ZoomIn, ZoomOut } from 'lucide-react'; import { ResponsiveContainer, LineChart, Line, XAxis, YAxis, CartesianGrid, Tooltip, Legend, Brush } from 'recharts'; // Accept metrics as a flat array (metrics_history) interface ChartPanelProps { metrics: any[]; } const ChartPanel: React.FC = ({ metrics }) => { const [zoom, setZoom] = useState(1); const handleZoomIn = () => setZoom(prev => Math.min(prev * 1.2, 5)); const handleZoomOut = () => setZoom(prev => Math.max(prev / 1.2, 1)); // Use metrics directly as epochs array const epochs = Array.isArray(metrics) ? metrics : []; const lossData = epochs.map(e => ({ epoch: e.epoch, loss: e.loss, val_loss: e.val_loss })); const accData = epochs.map(e => ({ epoch: e.epoch, accuracy: e.accuracy, val_acc: e.val_acc })); // Adjust data based on zoom const zoomedDataLength = Math.ceil(lossData.length / zoom); const startIndex = Math.max(0, lossData.length - zoomedDataLength); const zoomedLossData = lossData.slice(startIndex); const zoomedAccData = accData.slice(startIndex); return (
{lossData.length > 0 ? ( <>
) : (

No training data available yet. Start a training job to see metrics.

)}
); }; export default ChartPanel;