Add new frontend - fix 26
This commit is contained in:
@@ -100,30 +100,84 @@ const OnboardingPage = () => {
|
|||||||
}
|
}
|
||||||
];
|
];
|
||||||
|
|
||||||
// Mock WebSocket for training progress
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (formData.trainingTaskId && currentStep === 4) {
|
const startTrainingWhenReachingStep4 = async () => {
|
||||||
const interval = setInterval(async () => {
|
// Only trigger if we just reached step 4 and haven't started training yet
|
||||||
|
if (currentStep === 4 && !formData.trainingTaskId && !loading) {
|
||||||
|
console.log('Auto-starting training for step 4...');
|
||||||
|
|
||||||
|
setLoading(true);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const status = await api.training.getTrainingStatus(formData.trainingTaskId);
|
// Check if we have required data
|
||||||
setTrainingProgress(status);
|
if (!formData.selected_products || formData.selected_products.length === 0) {
|
||||||
|
showNotification('error', 'No hay productos', 'No se han seleccionado productos para entrenar.');
|
||||||
if (status.status === 'completed') {
|
setLoading(false);
|
||||||
setCompletedSteps([...completedSteps, 4]);
|
return;
|
||||||
clearInterval(interval);
|
|
||||||
showNotification('success', '¡Entrenamiento completado!', 'Los modelos están listos para usar.');
|
|
||||||
} else if (status.status === 'failed') {
|
|
||||||
clearInterval(interval);
|
|
||||||
showNotification('error', 'Error en entrenamiento', 'Hubo un problema durante el entrenamiento.');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!currentTenantId) {
|
||||||
|
showNotification('error', 'Error de configuración', 'No se ha configurado el tenant ID.');
|
||||||
|
setLoading(false);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Training configuration
|
||||||
|
const trainingConfig = {
|
||||||
|
include_weather: true,
|
||||||
|
include_traffic: true,
|
||||||
|
products: formData.selected_products,
|
||||||
|
min_data_points: 30,
|
||||||
|
forecast_horizon_days: 7,
|
||||||
|
cross_validation_folds: 3,
|
||||||
|
hyperparameter_tuning: true
|
||||||
|
};
|
||||||
|
|
||||||
|
console.log('Starting training with config:', trainingConfig);
|
||||||
|
|
||||||
|
// Start training via API
|
||||||
|
const trainingJob = await api.training.startTraining(trainingConfig);
|
||||||
|
|
||||||
|
// Update form data with training job ID
|
||||||
|
setFormData(prev => ({
|
||||||
|
...prev,
|
||||||
|
trainingTaskId: trainingJob.id,
|
||||||
|
trainingStatus: 'running'
|
||||||
|
}));
|
||||||
|
|
||||||
|
showNotification('info', 'Entrenamiento iniciado', 'Los modelos se están entrenando...');
|
||||||
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('Error fetching training status:', error);
|
console.error('Error starting training:', error);
|
||||||
|
|
||||||
|
let errorMessage = 'No se pudo iniciar el entrenamiento.';
|
||||||
|
let errorTitle = 'Error de entrenamiento';
|
||||||
|
|
||||||
|
if (error.response?.status === 400) {
|
||||||
|
errorMessage = error.response.data?.detail || 'Configuración de entrenamiento inválida.';
|
||||||
|
} else if (error.response?.status === 401) {
|
||||||
|
errorMessage = 'No autorizado. Por favor, inicia sesión nuevamente.';
|
||||||
|
errorTitle = 'Error de autenticación';
|
||||||
|
} else if (error.response?.status === 403) {
|
||||||
|
errorMessage = 'No tienes permisos para iniciar el entrenamiento.';
|
||||||
|
errorTitle = 'Error de permisos';
|
||||||
|
} else if (error.response?.status === 500) {
|
||||||
|
errorMessage = 'Error interno del servidor. Inténtalo más tarde.';
|
||||||
|
errorTitle = 'Error del servidor';
|
||||||
|
}
|
||||||
|
|
||||||
|
showNotification('error', errorTitle, errorMessage);
|
||||||
|
|
||||||
|
// Optionally go back to previous step on error
|
||||||
|
// setCurrentStep(3);
|
||||||
|
} finally {
|
||||||
|
setLoading(false);
|
||||||
}
|
}
|
||||||
}, 2000);
|
}
|
||||||
|
};
|
||||||
return () => clearInterval(interval);
|
|
||||||
}
|
startTrainingWhenReachingStep4();
|
||||||
}, [formData.trainingTaskId, currentStep]);
|
}, [currentStep, formData.trainingTaskId, formData.selected_products, currentTenantId, loading]);
|
||||||
|
|
||||||
const showNotification = (type, title, message) => {
|
const showNotification = (type, title, message) => {
|
||||||
const id = Date.now().toString();
|
const id = Date.now().toString();
|
||||||
|
|||||||
Reference in New Issue
Block a user