Spaces:
Running
Running
GitLab CI commited on
Commit ·
28d43df
1
Parent(s): 176aec5
Déploiement automatique depuis GitLab CI - 2026-02-27 13:58:03
Browse files
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
|
| 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 |
-
|
| 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 |
-
|
| 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 |
-
|
| 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 |
|