'localhost', 'dbname' => 'wevads', 'user' => 'admin', 'password' => WEVADS_DB_PASS ]; try { $pdo = new PDO( "pgsql:host={$db_config['host']};dbname={$db_config['dbname']}", $db_config['user'], $db_config['password'], [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION] ); $pdo->exec("SET search_path TO admin, public;"); $action = $_GET['action'] ?? 'status'; switch ($action) { case 'start': $modelId = $_GET['model_id'] ?? null; $datasetId = $_GET['dataset_id'] ?? null; if (!$modelId || !$datasetId) { echo json_encode(['status' => 'error', 'message' => 'model_id et dataset_id requis']); break; } // Créer un job d'entraînement $stmt = $pdo->prepare(" INSERT INTO admin.deepseek_training_jobs (model_id, status, training_start, total_epochs) VALUES (:model_id, 'running', NOW(), :epochs) RETURNING id "); $stmt->execute([ ':model_id' => $modelId, ':epochs' => $_GET['epochs'] ?? 100 ]); $jobId = $stmt->fetchColumn(); // Simulation d'entraînement (en réalité, appeler un script Python) echo json_encode([ 'status' => 'success', 'message' => 'Job d\'entraînement démarré', 'job_id' => $jobId, 'model_id' => $modelId, 'dataset_id' => $datasetId, 'estimated_time' => '15-30 minutes', 'progress_url' => '/api/deepseek-training.php?action=progress&job_id=' . $jobId ]); break; case 'progress': $jobId = $_GET['job_id'] ?? null; if (!$jobId) { echo json_encode(['status' => 'error', 'message' => 'job_id requis']); break; } $stmt = $pdo->prepare("SELECT * FROM admin.deepseek_training_jobs WHERE id = :id"); $stmt->execute([':id' => $jobId]); $job = $stmt->fetch(PDO::FETCH_ASSOC); if (!$job) { echo json_encode(['status' => 'error', 'message' => 'Job non trouvé']); break; } // Simuler la progression $progress = 0; if ($job['status'] === 'running') { $progress = min(100, ($job['epochs_completed'] / ($job['total_epochs'] ?: 100)) * 100); $progress = round($progress + rand(1, 5)); // Simulation // Mettre à jour la progression $pdo->prepare(" UPDATE admin.deepseek_training_jobs SET epochs_completed = :epochs, loss_value = :loss WHERE id = :id ")->execute([ ':epochs' => min($job['total_epochs'], $job['epochs_completed'] + 5), ':loss' => max(0.001, $job['loss_value'] - rand(0.001, 0.01)), ':id' => $jobId ]); } echo json_encode([ 'status' => 'success', 'job' => $job, 'progress' => $progress . '%', 'estimated_completion' => $progress >= 100 ? 'Terminé' : '10-15 minutes', 'metrics' => [ 'loss' => $job['loss_value'] ?? 0.1234, 'accuracy' => $job['accuracy_value'] ?? null ] ]); break; case 'jobs': $status = $_GET['status'] ?? 'all'; $query = "SELECT * FROM admin.deepseek_training_jobs"; $params = []; if ($status !== 'all') { $query .= " WHERE status = :status"; $params[':status'] = $status; } $query .= " ORDER BY created_at DESC LIMIT 50"; $stmt = $pdo->prepare($query); $stmt->execute($params); $jobs = $stmt->fetchAll(PDO::FETCH_ASSOC); // Statistiques des jobs $stats = $pdo->query(" SELECT status, COUNT(*) as count, ROUND(AVG(EXTRACT(EPOCH FROM (training_end - training_start))), 2) as avg_duration_seconds FROM admin.deepseek_training_jobs GROUP BY status ")->fetchAll(PDO::FETCH_ASSOC); echo json_encode([ 'status' => 'success', 'jobs' => $jobs, 'statistics' => $stats, 'total_jobs' => count($jobs) ]); break; case 'hyperparams': $modelId = $_GET['model_id'] ?? null; if ($modelId) { $stmt = $pdo->prepare("SELECT * FROM admin.deepseek_hyperparams WHERE model_id = :model_id"); $stmt->execute([':model_id' => $modelId]); $params = $stmt->fetchAll(PDO::FETCH_ASSOC); } else { $params = $pdo->query("SELECT * FROM admin.deepseek_hyperparams ORDER BY created_at DESC")->fetchAll(PDO::FETCH_ASSOC); } echo json_encode([ 'status' => 'success', 'hyperparameters' => $params, 'defaults' => [ 'learning_rate' => 0.001, 'batch_size' => 32, 'epochs' => 100, 'optimizer' => 'adam' ] ]); break; default: echo json_encode([ 'status' => 'error', 'message' => 'Action non reconnue', 'endpoints' => [ 'GET ?action=jobs' => 'Liste des jobs d\'entraînement', 'GET ?action=start&model_id=X&dataset_id=Y' => 'Démarrer un entraînement', 'GET ?action=progress&job_id=X' => 'Progression d\'un job', 'GET ?action=hyperparams&model_id=X' => 'Hyperparamètres d\'un modèle' ] ]); } } catch (PDOException $e) { echo json_encode([ 'status' => 'error', 'message' => 'Erreur base de données: ' . $e->getMessage(), 'fallback' => [ 'status' => 'training_simulation', 'jobs' => [ ['id' => 1, 'model_id' => 1, 'status' => 'running', 'progress' => '65%'], ['id' => 2, 'model_id' => 2, 'status' => 'completed', 'accuracy' => '98.7%'] ] ] ]); } ?>