Spaces:
Runtime error
Runtime error
| title: Cardiac Monitor API | |
| emoji: ❤️ | |
| colorFrom: red | |
| colorTo: blue | |
| sdk: docker | |
| pinned: false | |
| license: mit | |
| app_port: 7860 | |
| short_description: Cardiac monitoring API with ML risk prediction | |
| # Cardiac Monitor API | |
| FastAPI backend for the ESP32 cardiac monitoring system. Handles user authentication, device management, vitals storage, and ML-based cardiac risk prediction. | |
| ## Live Deployment | |
| **URL**: `https://sanuka0523-cardiac-monitor-api.hf.space` | |
| Hosted on Hugging Face Spaces (Docker SDK). The API docs are available at `/docs` (Swagger UI). | |
| ## Tech Stack | |
| - **Framework**: FastAPI 0.115 | |
| - **Database**: MongoDB Atlas via Motor (async) | |
| - **Auth**: JWT (python-jose) + bcrypt password hashing | |
| - **ML**: PyTorch (ECGFounder) + XGBoost ensemble | |
| - **Signal Processing**: NeuroKit2, SciPy | |
| ## API Reference | |
| ### Authentication | |
| | Method | Path | Body | Response | | |
| |--------|------|------|----------| | |
| | POST | `/api/v1/auth/register` | `{email, password, name}` | `{access_token, token_type}` | | |
| | POST | `/api/v1/auth/login` | Form: `username, password` | `{access_token, token_type}` | | |
| | GET | `/api/v1/auth/me` | — | User object | | |
| | PUT | `/api/v1/auth/profile` | `{health_profile: {...}}` | Updated user | | |
| ### Devices | |
| | Method | Path | Body | Response | | |
| |--------|------|------|----------| | |
| | POST | `/api/v1/devices/register` | `{device_id}` | Device object | | |
| | GET | `/api/v1/devices` | — | List of devices | | |
| ### Vitals (ESP32 uploads) | |
| | Method | Path | Auth | Body | | |
| |--------|------|------|------| | |
| | POST | `/api/v1/vitals` | API Key | `{device_id, timestamp, ecg_samples, heart_rate_bpm, spo2_percent, ...}` | | |
| | GET | `/api/v1/vitals/{device_id}` | JWT | Vitals history (paginated) | | |
| | GET | `/api/v1/vitals/{device_id}/latest` | JWT | Latest vitals reading | | |
| ### Predictions | |
| | Method | Path | Auth | Response | | |
| |--------|------|------|----------| | |
| | GET | `/api/v1/predictions/{device_id}/latest` | JWT | Latest risk prediction | | |
| | GET | `/api/v1/predictions/{device_id}` | JWT | Prediction history | | |
| ## Environment Variables | |
| | Variable | Description | Required | | |
| |----------|-------------|----------| | |
| | `MONGODB_URI` | MongoDB Atlas connection string | Yes | | |
| | `DATABASE_NAME` | Database name (default: `cardiac_monitor`) | No | | |
| | `JWT_SECRET` | Secret key for JWT signing | Yes | | |
| | `API_KEY` | API key for ESP32 device auth | Yes | | |
| ## Database Collections | |
| | Collection | Purpose | Key Fields | | |
| |------------|---------|------------| | |
| | `users` | User accounts + health profiles | email, password_hash, health_profile | | |
| | `devices` | Registered ESP32 devices | device_id, owner_user_id | | |
| | `vitals` | Raw vitals readings | device_id, timestamp, ecg_samples, heart_rate_bpm | | |
| | `predictions` | ML risk predictions | vitals_id, risk_score, risk_label, confidence | | |
| ## ML Pipeline | |
| On each vitals upload, the backend runs an ensemble prediction: | |
| 1. **ECGFounder** (PyTorch): Deep learning model extracts features from raw ECG waveform | |
| 2. **Feature Engineering**: 14 clinical features (HRV, QRS duration, signal quality, etc.) | |
| 3. **XGBoost**: Gradient-boosted classifier on combined features | |
| 4. **Ensemble**: Weighted combination produces final risk score (0.0-1.0) and label | |
| Risk labels: `normal`, `low`, `moderate`, `elevated`, `high` | |
| ## Local Development | |
| ```bash | |
| cd backend | |
| pip install -r requirements.txt | |
| # Set environment variables | |
| export MONGODB_URI="mongodb+srv://..." | |
| export JWT_SECRET="your-secret" | |
| export API_KEY="your-api-key" | |
| # Run | |
| uvicorn app.main:app --reload --port 8000 | |
| ``` | |
| ## Docker Deployment | |
| ```bash | |
| docker build -t cardiac-api . | |
| docker run -p 7860:7860 \ | |
| -e MONGODB_URI="..." \ | |
| -e JWT_SECRET="..." \ | |
| -e API_KEY="..." \ | |
| cardiac-api | |
| ``` | |
| ## Project Structure | |
| ``` | |
| backend/ | |
| ├── app/ | |
| │ ├── main.py # FastAPI app, CORS, router mounting | |
| │ ├── config.py # Pydantic settings (env vars) | |
| │ ├── database.py # Motor client, index creation | |
| │ ├── middleware/ | |
| │ │ └── auth.py # JWT + API key verification | |
| │ ├── models/ # Pydantic request/response models | |
| │ │ ├── user.py | |
| │ │ ├── device.py | |
| │ │ ├── vitals.py | |
| │ │ └── prediction.py | |
| │ ├── routes/ # API endpoint handlers | |
| │ │ ├── auth.py | |
| │ │ ├── devices.py | |
| │ │ ├── health.py | |
| │ │ ├── vitals.py | |
| │ │ └── predictions.py | |
| │ └── services/ | |
| │ └── ml_service.py # ML model loading + prediction | |
| ├── ml_src/ | |
| │ ├── ecg_foundation.py # ECGFounder model definition | |
| │ └── feature_engineer.py # Clinical feature extraction | |
| ├── ml_models/ # Trained model files (LFS) | |
| │ ├── ecgfounder_best.pt | |
| │ └── xgboost_cardiac.joblib | |
| ├── Dockerfile | |
| └── requirements.txt | |
| ``` | |