from __future__ import annotations import json from pathlib import Path import joblib import pandas as pd def _load_artifact(model_dir: str | Path): model_path = Path(model_dir) / "mindpulse_rf.joblib" raw = joblib.load(model_path) if isinstance(raw, dict) and "model" in raw: model = raw["model"] feature_names = raw.get( "feature_names", ["heart_rate", "hrv_rmssd", "motion_level", "hr_baseline", "rmssd_baseline"], ) return model, feature_names return raw, ["heart_rate", "hrv_rmssd", "motion_level", "hr_baseline", "rmssd_baseline"] def predict(model_dir: str, inputs: dict): model, feature_names = _load_artifact(model_dir) row = {name: float(inputs[name]) for name in feature_names} x = pd.DataFrame([row], columns=feature_names) score = float(model.predict(x)[0]) score = max(0.0, min(1.0, score)) return {"engagement_score": score}