GitLab CI commited on
Commit
28d43df
·
1 Parent(s): 176aec5

Déploiement automatique depuis GitLab CI - 2026-02-27 13:58:03

Browse files
Files changed (1) hide show
  1. api.py +13 -7
api.py CHANGED
@@ -94,7 +94,7 @@ def upload_to_hf(local_path: str, repo_path: str):
94
  logger.warning(f"Upload HF échoué: {e}")
95
 
96
 
97
- def save_and_upload_logs(input_df: pd.DataFrame, predictions: list):
98
  """
99
  Enregistre les données d'entrée/sortie et les logs, puis les uploade vers HF.
100
 
@@ -122,10 +122,9 @@ def save_and_upload_logs(input_df: pd.DataFrame, predictions: list):
122
  )
123
  # Log d'information sur le nombre de lignes écrites
124
  logger.info(f"Données enregistrées pour drift detection: {len(log_df)} lignes")
125
-
126
  # Upload vers HF pour persistance permanente
127
  upload_to_hf(DRIFT_LOG_PATH, "data_io.csv")
128
- upload_to_hf(LOG_FILE_PATH, "api_log.jsonl")
129
  except Exception as e:
130
  # En cas d'erreur, on loggue un warning mais on ne remonte pas d'exception
131
  logger.warning(f"Impossible d'enregistrer les données pour drift: {str(e)}")
@@ -363,11 +362,12 @@ def predict(input_data: PredictionInput):
363
  X.insert(0, 'SK_ID_CURR', 0)
364
 
365
  # Enregistrer les données pour la détection de drift (asynchrone côté storage)
366
- save_and_upload_logs(X, [prediction])
367
 
368
  execution_time = time.time() - start_time
369
  logger.info(f"Prédiction effectuée avec succès: {prediction} (proba={proba_default:.4f}, seuil={THRESHOLD}, temps={execution_time:.4f}s)")
370
-
 
371
  # Retourner une réponse conforme au modèle de sortie Pydantic
372
  return PredictionOutput(
373
  prediction=prediction,
@@ -379,6 +379,8 @@ def predict(input_data: PredictionInput):
379
  # En cas d'erreur lors du traitement, log et remonter une HTTPException
380
  execution_time = time.time() - start_time
381
  logger.error(f"Erreur lors de la prédiction: {str(e)} (temps d'exécution: {execution_time:.4f}s)")
 
 
382
  raise HTTPException(status_code=400, detail=str(e))
383
 
384
 
@@ -442,11 +444,12 @@ async def predict_from_file(file: UploadFile = File(...)):
442
  X.insert(0, 'SK_ID_CURR', df.index)
443
 
444
  # Enregistrer les données pour la détection de drift
445
- save_and_upload_logs(X, predictions)
446
 
447
  execution_time = time.time() - start_time
448
  logger.info(f"Prédictions effectuées avec succès: {len(predictions)} résultats (temps d'exécution: {execution_time:.4f}s)")
449
-
 
450
  # Retourner un dictionnaire simple contenant les résultats
451
  return {
452
  "predictions": predictions,
@@ -455,6 +458,7 @@ async def predict_from_file(file: UploadFile = File(...)):
455
  "count": len(predictions),
456
  "status": "success"
457
  }
 
458
  except HTTPException:
459
  # Remonter les HTTPException telles quelles (déjà explicites)
460
  raise
@@ -462,6 +466,8 @@ async def predict_from_file(file: UploadFile = File(...)):
462
  # Tout autre erreur -> log et lever une HTTPException générique
463
  execution_time = time.time() - start_time
464
  logger.error(f"Erreur lors du traitement du fichier: {str(e)} (temps d'exécution: {execution_time:.4f}s)")
 
 
465
  raise HTTPException(status_code=400, detail=str(e))
466
 
467
 
 
94
  logger.warning(f"Upload HF échoué: {e}")
95
 
96
 
97
+ def save_and_upload_csv_logs(input_df: pd.DataFrame, predictions: list):
98
  """
99
  Enregistre les données d'entrée/sortie et les logs, puis les uploade vers HF.
100
 
 
122
  )
123
  # Log d'information sur le nombre de lignes écrites
124
  logger.info(f"Données enregistrées pour drift detection: {len(log_df)} lignes")
 
125
  # Upload vers HF pour persistance permanente
126
  upload_to_hf(DRIFT_LOG_PATH, "data_io.csv")
127
+
128
  except Exception as e:
129
  # En cas d'erreur, on loggue un warning mais on ne remonte pas d'exception
130
  logger.warning(f"Impossible d'enregistrer les données pour drift: {str(e)}")
 
362
  X.insert(0, 'SK_ID_CURR', 0)
363
 
364
  # Enregistrer les données pour la détection de drift (asynchrone côté storage)
365
+ save_and_upload_csv_logs(X, [prediction])
366
 
367
  execution_time = time.time() - start_time
368
  logger.info(f"Prédiction effectuée avec succès: {prediction} (proba={proba_default:.4f}, seuil={THRESHOLD}, temps={execution_time:.4f}s)")
369
+ # Upload des logs vers HF pour persistance permanente
370
+ upload_to_hf(LOG_FILE_PATH, "api_log.jsonl")
371
  # Retourner une réponse conforme au modèle de sortie Pydantic
372
  return PredictionOutput(
373
  prediction=prediction,
 
379
  # En cas d'erreur lors du traitement, log et remonter une HTTPException
380
  execution_time = time.time() - start_time
381
  logger.error(f"Erreur lors de la prédiction: {str(e)} (temps d'exécution: {execution_time:.4f}s)")
382
+ # Upload des logs vers HF même en cas d'erreur pour garder une trace de l'incident
383
+ upload_to_hf(LOG_FILE_PATH, "api_log.jsonl")
384
  raise HTTPException(status_code=400, detail=str(e))
385
 
386
 
 
444
  X.insert(0, 'SK_ID_CURR', df.index)
445
 
446
  # Enregistrer les données pour la détection de drift
447
+ save_and_upload_csv_logs(X, predictions)
448
 
449
  execution_time = time.time() - start_time
450
  logger.info(f"Prédictions effectuées avec succès: {len(predictions)} résultats (temps d'exécution: {execution_time:.4f}s)")
451
+ # Upload des logs vers HF pour persistance permanente
452
+ upload_to_hf(LOG_FILE_PATH, "api_log.jsonl")
453
  # Retourner un dictionnaire simple contenant les résultats
454
  return {
455
  "predictions": predictions,
 
458
  "count": len(predictions),
459
  "status": "success"
460
  }
461
+
462
  except HTTPException:
463
  # Remonter les HTTPException telles quelles (déjà explicites)
464
  raise
 
466
  # Tout autre erreur -> log et lever une HTTPException générique
467
  execution_time = time.time() - start_time
468
  logger.error(f"Erreur lors du traitement du fichier: {str(e)} (temps d'exécution: {execution_time:.4f}s)")
469
+ # Upload des logs vers HF même en cas d'erreur pour garder une trace de l'incident
470
+ upload_to_hf(LOG_FILE_PATH, "api_log.jsonl")
471
  raise HTTPException(status_code=400, detail=str(e))
472
 
473