{"openapi":"3.1.0","info":{"title":"Datamart Analysis with ML for Retails API","version":"1.0.0"},"paths":{"/api/v1/health":{"get":{"tags":["health-v1"],"summary":"Health V1","operationId":"health_v1_api_v1_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthResponse"}}}}}}},"/api/v1/ready":{"get":{"tags":["health-v1"],"summary":"Ready V1","operationId":"ready_v1_api_v1_ready_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReadyResponse"}}}}}}},"/api/v1/version":{"get":{"tags":["health-v1"],"summary":"Version V1","operationId":"version_v1_api_v1_version_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VersionResponse"}}}}}}},"/api/v1/project":{"get":{"tags":["project"],"summary":"Project Context","description":"Retourne les références métier (jeu de données, cible Display, Shiny, rapport PDF).","operationId":"project_context_api_v1_project_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectContextResponse"}}}}}}},"/api/v1/testimonials":{"get":{"tags":["testimonials"],"summary":"List Testimonials","description":"Retourne les témoignages affichés sur la landing.\n\nSource unique : ``app/content/testimonials.json``.","operationId":"list_testimonials_api_v1_testimonials_get","parameters":[{"name":"locale","in":"query","required":false,"schema":{"enum":["fr","en"],"type":"string","description":"Langue des textes : fr ou en.","default":"fr","title":"Locale"},"description":"Langue des textes : fr ou en."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Testimonials Api V1 Testimonials Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/files/upload":{"post":{"tags":["files-v1"],"summary":"Upload Csv","operationId":"upload_csv_api_v1_files_upload_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_csv_api_v1_files_upload_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FileUploadResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/datasets/validate":{"post":{"tags":["datasets-v1"],"summary":"Validate Dataset","operationId":"validate_dataset_api_v1_datasets_validate_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DatasetValidateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DatasetValidateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/auth/login":{"post":{"tags":["auth"],"summary":"Login","operationId":"login_auth_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/rate-limit":{"get":{"tags":["rate-limiting"],"summary":"Configuration des limites de débit","description":"Expose les quotas effectifs appliqués par slowapi (global + routes sensibles). Les compteurs restants par IP ne sont pas renvoyés ici ; ils apparaissent dans les en-têtes HTTP lorsque RATE_LIMIT_HEADERS_ENABLED=true.","operationId":"rate_limit_status_rate_limit_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitStatusResponse"}}}}}}},"/health":{"get":{"tags":["health"],"summary":"Health","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthResponse"}}}}}}},"/ready":{"get":{"tags":["health"],"summary":"Ready","description":"Readiness : modèle présent + état config DB (connexion = roadmap).","operationId":"ready_ready_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReadyResponse"}}}}}}},"/version":{"get":{"tags":["health"],"summary":"Version","operationId":"version_version_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VersionResponse"}}}}}}},"/demo/carousel-manifest":{"get":{"tags":["demo"],"summary":"Carousel Manifest","description":"Liste ordonnée des GIF de démo (noms de fichiers sous /demo côté Next).","operationId":"carousel_manifest_demo_carousel_manifest_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DemoCarouselResponse"}}}}}}},"/ml/preprocess-contract":{"get":{"tags":["ml"],"summary":"Preprocess Contract","operationId":"preprocess_contract_ml_preprocess_contract_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreprocessContractResponse"}}}}}}},"/ml/prediction-guide":{"get":{"tags":["ml"],"summary":"Prediction Guide","description":"Repères de lecture pour l’écran Prédictions (utilisateur métier), FR ou EN.","operationId":"prediction_guide_ml_prediction_guide_get","parameters":[{"name":"locale","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Langue du guide : `fr` (défaut) ou `en`. Sinon dérivé de Accept-Language.","title":"Locale"},"description":"Langue du guide : `fr` (défaut) ou `en`. Sinon dérivé de Accept-Language."},{"name":"Accept-Language","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept-Language"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PredictionGuideResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/metrics":{"get":{"tags":["metrics"],"summary":"Metrics","operationId":"metrics_metrics_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetricsResponse"}}}}}}},"/predict":{"post":{"tags":["predict"],"summary":"Predict","operationId":"predict_predict_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DisplayFeaturesRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PredictResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/predict/batch":{"post":{"tags":["predict"],"summary":"Predict Batch","operationId":"predict_batch_predict_batch_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchPredictRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchPredictResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/ml/sync-from-gcs":{"post":{"tags":["ml"],"summary":"Sync From Gcs","description":"Télécharge le bundle (et optionnellement les métriques) depuis GCS. JWT requis.","operationId":"sync_from_gcs_ml_sync_from_gcs_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"force","in":"query","required":false,"schema":{"type":"boolean","description":"Si true, réécrit les fichiers même s’ils existent déjà localement.","default":false,"title":"Force"},"description":"Si true, réécrit les fichiers même s’ils existent déjà localement."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MlGcsSyncResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/train":{"post":{"tags":["train"],"summary":"Train","operationId":"train_train_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrainResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/":{"get":{"summary":"Landing","operationId":"landing__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/monitoring":{"get":{"summary":"Monitoring Page","operationId":"monitoring_page_monitoring_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"BatchPredictRequest":{"properties":{"rows":{"items":{"$ref":"#/components/schemas/DisplayFeaturesRequest"},"type":"array","minItems":1,"title":"Rows"}},"type":"object","required":["rows"],"title":"BatchPredictRequest","description":"Plusieurs lignes datamart (mêmes champs que ``DisplayFeaturesRequest``)."},"BatchPredictResponse":{"properties":{"model_name":{"type":"string","title":"Model Name"},"count":{"type":"integer","title":"Count"},"results":{"items":{"$ref":"#/components/schemas/BatchPredictRowResult"},"type":"array","title":"Results"}},"type":"object","required":["model_name","count","results"],"title":"BatchPredictResponse"},"BatchPredictRowResult":{"properties":{"row_index":{"type":"integer","title":"Row Index"},"prediction":{"type":"integer","title":"Prediction"},"label":{"type":"string","title":"Label"},"probability_default":{"type":"number","title":"Probability Default"},"interpretation":{"additionalProperties":true,"type":"object","title":"Interpretation","description":"Même structure que POST /predict : tranche de risque, entrées métier, indices selon le modèle."}},"type":"object","required":["row_index","prediction","label","probability_default","interpretation"],"title":"BatchPredictRowResult"},"Body_upload_csv_api_v1_files_upload_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File","description":"Fichier CSV (datamart Display / Base CDM)"}},"type":"object","required":["file"],"title":"Body_upload_csv_api_v1_files_upload_post"},"DatasetValidateRequest":{"properties":{"file_id":{"type":"string","title":"File Id","description":"Identifiant retourné par POST /api/v1/files/upload"},"csv_sep":{"type":"string","maxLength":8,"minLength":1,"title":"Csv Sep","default":";"},"csv_skiprows":{"type":"integer","maximum":100.0,"minimum":0.0,"title":"Csv Skiprows","default":1},"preview_rows":{"type":"integer","maximum":50.0,"minimum":0.0,"title":"Preview Rows","default":5}},"type":"object","required":["file_id"],"title":"DatasetValidateRequest"},"DatasetValidateResponse":{"properties":{"valid":{"type":"boolean","title":"Valid"},"errors":{"items":{"type":"string"},"type":"array","title":"Errors"},"columns":{"items":{"type":"string"},"type":"array","title":"Columns"},"n_rows":{"type":"integer","title":"N Rows"},"dtypes":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Dtypes"},"preview":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Preview"}},"type":"object","required":["valid","errors","columns","n_rows"],"title":"DatasetValidateResponse"},"DemoCarouselResponse":{"properties":{"version":{"type":"integer","title":"Version"},"slides":{"items":{"$ref":"#/components/schemas/DemoCarouselSlide"},"type":"array","title":"Slides"}},"type":"object","required":["version","slides"],"title":"DemoCarouselResponse"},"DemoCarouselSlide":{"properties":{"file":{"type":"string","title":"File"},"title_key":{"type":"string","title":"Title Key"}},"type":"object","required":["file","title_key"],"title":"DemoCarouselSlide","description":"Une entrée du carrousel GIF (fichier servi par le frontend sous /demo/)."},"DisplayFeaturesRequest":{"properties":{"ENSEIGNE":{"type":"string","title":"Enseigne","description":"Enseigne distributeur"},"Feature":{"type":"string","title":"Feature","description":"Feature produit (Feat / No_Feat, etc.)"},"cor_sales_in_vol":{"type":"number","title":"Cor Sales In Vol","description":"Corrélation / ventes volume"},"cor_sales_in_val":{"type":"number","title":"Cor Sales In Val","description":"Corrélation / ventes valeur"},"CA_mag":{"type":"number","title":"Ca Mag","description":"Chiffre d'affaires magasin"},"value":{"type":"number","title":"Value","description":"Valeur agrégée"},"VenteConv":{"type":"number","title":"Venteconv","description":"Vente convertie"}},"type":"object","required":["ENSEIGNE","Feature","cor_sales_in_vol","cor_sales_in_val","CA_mag","value","VenteConv"],"title":"DisplayFeaturesRequest","description":"Variables brutes alignées sur ranaviz.R / rapport (sans la cible ``Display``)."},"FileUploadResponse":{"properties":{"file_id":{"type":"string","title":"File Id"},"original_filename":{"type":"string","title":"Original Filename"},"size_bytes":{"type":"integer","title":"Size Bytes"},"message":{"type":"string","title":"Message","default":"Fichier stocké. Utilisez file_id avec POST /api/v1/datasets/validate."}},"type":"object","required":["file_id","original_filename","size_bytes"],"title":"FileUploadResponse"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"HealthResponse":{"properties":{"status":{"type":"string","title":"Status"},"model_loaded":{"type":"boolean","title":"Model Loaded"}},"type":"object","required":["status","model_loaded"],"title":"HealthResponse"},"LoginRequest":{"properties":{"username":{"type":"string","title":"Username"},"password":{"type":"string","title":"Password"}},"type":"object","required":["username","password"],"title":"LoginRequest"},"MetricsResponse":{"properties":{"model_name":{"type":"string","title":"Model Name"},"metrics":{"additionalProperties":{"type":"number"},"type":"object","title":"Metrics"},"feature_columns":{"items":{"type":"string"},"type":"array","title":"Feature Columns"},"task_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Task Type"},"target_column":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Column"},"n_classes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"N Classes"},"n_rows_preprocessed":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"N Rows Preprocessed"},"n_rows_train":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"N Rows Train"},"n_rows_test":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"N Rows Test"},"n_features":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"N Features"},"class_distribution_full":{"anyOf":[{"additionalProperties":{"type":"integer"},"type":"object"},{"type":"null"}],"title":"Class Distribution Full"},"class_distribution_train":{"anyOf":[{"additionalProperties":{"type":"integer"},"type":"object"},{"type":"null"}],"title":"Class Distribution Train"},"class_distribution_test":{"anyOf":[{"additionalProperties":{"type":"integer"},"type":"object"},{"type":"null"}],"title":"Class Distribution Test"},"class_labels":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Class Labels"},"prevalence_positive_train":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Prevalence Positive Train"},"prevalence_positive_test":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Prevalence Positive Test"},"minority_class_ratio_train":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Minority Class Ratio Train"}},"type":"object","required":["model_name","metrics","feature_columns"],"title":"MetricsResponse"},"MlGcsSyncResponse":{"properties":{"bundle":{"additionalProperties":true,"type":"object","title":"Bundle"},"metrics":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metrics"}},"type":"object","required":["bundle"],"title":"MlGcsSyncResponse","description":"Résultat de ``POST /ml/sync-from-gcs`` (téléchargement depuis GCS)."},"PredictResponse":{"properties":{"prediction":{"type":"integer","title":"Prediction"},"label":{"type":"string","title":"Label"},"probability_default":{"type":"number","title":"Probability Default"},"model_name":{"type":"string","title":"Model Name"},"interpretation":{"additionalProperties":true,"type":"object","title":"Interpretation","description":"Repères métier : tranche de risque, entrées utiles, indices techniques selon le modèle."}},"type":"object","required":["prediction","label","probability_default","model_name","interpretation"],"title":"PredictResponse"},"PredictionGuideResponse":{"properties":{"target":{"type":"string","title":"Target"},"target_description":{"type":"string","title":"Target Description"},"probability_meaning":{"type":"string","title":"Probability Meaning"},"decision_rule":{"type":"string","title":"Decision Rule"},"risk_bands":{"additionalProperties":{"additionalProperties":{"type":"number"},"type":"object"},"type":"object","title":"Risk Bands"},"reading_tips":{"items":{"type":"string"},"type":"array","title":"Reading Tips"},"references":{"type":"string","title":"References"}},"type":"object","required":["target","target_description","probability_meaning","decision_rule","risk_bands","reading_tips","references"],"title":"PredictionGuideResponse","description":"Texte de référence pour l’UI Prédictions (aligné rapport PDF / ranaviz.R)."},"PreprocessContractResponse":{"properties":{"reference":{"type":"string","title":"Reference"},"target_column":{"type":"string","title":"Target Column"},"sas_rename_map":{"additionalProperties":{"type":"string"},"type":"object","title":"Sas Rename Map"},"categorical_columns":{"items":{"type":"string"},"type":"array","title":"Categorical Columns"},"quantitative_source_columns":{"items":{"type":"string"},"type":"array","title":"Quantitative Source Columns"},"column_dropped_after_correlation":{"type":"string","title":"Column Dropped After Correlation"},"predict_api_features":{"items":{"type":"string"},"type":"array","title":"Predict Api Features"},"categorical_modalities":{"additionalProperties":{"items":{"type":"string"},"type":"array"},"type":"object","title":"Categorical Modalities"},"predict_batch_max_rows":{"type":"integer","title":"Predict Batch Max Rows"},"age_cred_note":{"type":"string","title":"Age Cred Note"},"preprocess":{"additionalProperties":true,"type":"object","title":"Preprocess"},"training":{"additionalProperties":true,"type":"object","title":"Training"},"models_compared":{"items":{"type":"string"},"type":"array","title":"Models Compared"},"variable_glossary":{"items":{"additionalProperties":{"type":"string"},"type":"object"},"type":"array","title":"Variable Glossary"}},"type":"object","required":["reference","target_column","sas_rename_map","categorical_columns","quantitative_source_columns","column_dropped_after_correlation","predict_api_features","categorical_modalities","predict_batch_max_rows","age_cred_note","preprocess","training","models_compared","variable_glossary"],"title":"PreprocessContractResponse","description":"Documentation machine-lisible du pipeline.\n\nContexte : new_Base_CDM_balanced_V2 / Scrypt / params.yaml."},"ProjectContextResponse":{"properties":{"app_name":{"type":"string","title":"App Name","description":"Nom de l’application API"},"dataset_primary":{"type":"string","title":"Dataset Primary","description":"Jeu tabulaire principal (CSV / SAS)"},"target_description":{"type":"string","title":"Target Description","description":"Cible binaire Display (Displ / No_Displ) et périmètre retail"},"legacy_shiny_app":{"type":"string","title":"Legacy Shiny App","description":"Référence à l’application Shiny historique (Visual Analytics)"},"academic_report_pdf":{"type":"string","title":"Academic Report Pdf","description":"Rapport d’analyse de données (méthodologie, EDA)"},"pipeline_capabilities":{"items":{"type":"string"},"type":"array","title":"Pipeline Capabilities","description":"Capacités du pipeline (équivalence fonctionnelle avec ranaviz / notebooks)"},"openapi_json_path":{"type":"string","title":"Openapi Json Path","description":"Chemin du schéma API JSON","default":"/api.json"}},"type":"object","required":["app_name","dataset_primary","target_description","legacy_shiny_app","academic_report_pdf","pipeline_capabilities"],"title":"ProjectContextResponse","description":"Métadonnées alignées sur le jeu new_Base_CDM_balanced_V2, ranaviz.R et le rapport PDF."},"RateLimitStatusResponse":{"properties":{"rate_limiting_enabled":{"type":"boolean","title":"Rate Limiting Enabled"},"storage":{"type":"string","title":"Storage"},"key":{"type":"string","title":"Key"},"environment":{"type":"string","title":"Environment"},"effective_multiplier":{"type":"number","title":"Effective Multiplier"},"headers_enabled":{"type":"boolean","title":"Headers Enabled"},"limits_effective":{"additionalProperties":{"type":"string"},"type":"object","title":"Limits Effective"},"limits_configured":{"additionalProperties":{"type":"string"},"type":"object","title":"Limits Configured"},"limits_requests_window":{"additionalProperties":{"additionalProperties":{"anyOf":[{"type":"integer"},{"type":"null"}]},"type":"object"},"type":"object","title":"Limits Requests Window"},"options":{"additionalProperties":{"anyOf":[{"type":"boolean"},{"type":"number"}]},"type":"object","title":"Options"},"header_names":{"additionalProperties":{"type":"string"},"type":"object","title":"Header Names"}},"type":"object","required":["rate_limiting_enabled","storage","key","environment","effective_multiplier","headers_enabled","limits_effective","limits_configured","limits_requests_window","options","header_names"],"title":"RateLimitStatusResponse","description":"Configuration effective des quotas (slowapi) — pas de compteur temps réel par client."},"ReadyResponse":{"properties":{"status":{"type":"string","title":"Status"},"model_loaded":{"type":"boolean","title":"Model Loaded"},"database_configured":{"type":"boolean","title":"Database Configured"},"environment":{"type":"string","title":"Environment"}},"type":"object","required":["status","model_loaded","database_configured","environment"],"title":"ReadyResponse"},"TokenResponse":{"properties":{"access_token":{"type":"string","title":"Access Token"},"token_type":{"type":"string","title":"Token Type","default":"bearer"}},"type":"object","required":["access_token"],"title":"TokenResponse"},"TrainResponse":{"properties":{"status":{"type":"string","title":"Status"},"model_name":{"type":"string","title":"Model Name"},"metrics":{"additionalProperties":{"type":"number"},"type":"object","title":"Metrics"},"artifact_path":{"type":"string","title":"Artifact Path"}},"type":"object","required":["status","model_name","metrics","artifact_path"],"title":"TrainResponse"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"VersionResponse":{"properties":{"app_name":{"type":"string","title":"App Name"},"version":{"type":"string","title":"Version"},"environment":{"type":"string","title":"Environment"},"build_sha":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Build Sha"}},"type":"object","required":["app_name","version","environment"],"title":"VersionResponse"}},"securitySchemes":{"HTTPBearer":{"type":"http","scheme":"bearer"}}},"tags":[{"name":"health","description":"Sondes racine (/health, /ready, /version)."},{"name":"health-v1","description":"Sondes versionnées sous /api/v1."},{"name":"project","description":"Contexte métier et références (jeu de données, Shiny, rapport)."},{"name":"files-v1","description":"Upload de fichiers (JWT) sous /api/v1."},{"name":"datasets-v1","description":"Validation de schéma dataset sous /api/v1."},{"name":"auth","description":"JWT OAuth2 password (login)."},{"name":"ml","description":"Contrat prétraitement, artefacts GCS, métriques."},{"name":"predict","description":"Inférence unitaire et batch (JWT)."},{"name":"train","description":"Lancement d’entraînement (JWT)."},{"name":"metrics","description":"Rapport métriques dernier entraînement (JWT)."},{"name":"demo","description":"Manifeste carrousel GIF (landing)."},{"name":"rate-limiting","description":"Informations sur les quotas."}]}