159 lines
3.1 KiB
Markdown
159 lines
3.1 KiB
Markdown
# ML-Serving-API
|
|
|
|
Diese Dokumentation beschreibt die REST-Endpunkte der aktuellen
|
|
Modell-Artefakt- und Vorhersage-Schnittstelle.
|
|
|
|
> Hinweis: Version 0.1.0 enthält noch kein statistisch trainiertes ML-Modell.
|
|
> Die Vorhersage ist eine deterministische Referenzimplementierung für den
|
|
> späteren Modellvertrag.
|
|
|
|
## Basis-URL
|
|
|
|
- Standard: `http://127.0.0.1:8000/ml`
|
|
- Health: `/health`
|
|
- Modelle: `/models`
|
|
- Retraining: `/retrain`
|
|
- Einzelvorhersage: `/predict`
|
|
- Batchvorhersage: `/batch`
|
|
|
|
Der Standard-Start erfolgt über `uvicorn app.main:app`, danach stehen HA- und
|
|
ML-Routen in derselben Anwendung bereit.
|
|
|
|
## Endpoints
|
|
|
|
### `GET /ml/health`
|
|
|
|
Health-Check der ML-Services.
|
|
|
|
**Beispielantwort**
|
|
```json
|
|
{
|
|
"status": "ok",
|
|
"updated_at": "2026-06-11T12:00:00Z"
|
|
}
|
|
```
|
|
|
|
### `GET /ml/models`
|
|
|
|
Listet alle registrierten Modell-Artefakte auf.
|
|
|
|
**Beispielantwort**
|
|
```json
|
|
{
|
|
"models": ["default"]
|
|
}
|
|
```
|
|
|
|
### `POST /ml/predict`
|
|
|
|
Einzelne Vorhersage für einen Sensor.
|
|
|
|
**Request**
|
|
```json
|
|
{
|
|
"modelId": "default",
|
|
"sensor_id": "sensor.kitchen",
|
|
"values": {"temperature": 21.0}
|
|
}
|
|
```
|
|
|
|
**Antwort**
|
|
```json
|
|
{
|
|
"model_id": "default",
|
|
"sensor_id": "sensor.kitchen",
|
|
"prediction": "default:sensor.kitchen:{'temperature': 21.0}"
|
|
}
|
|
```
|
|
|
|
### `POST /ml/retrain`
|
|
|
|
Trainiert die Artefakt-Metadaten aus neuen Sensordaten. Existiert `modelId`
|
|
bereits, wird das Artefakt atomisch ersetzt und beim nächsten Prozessstart aus
|
|
dem Modellverzeichnis geladen.
|
|
|
|
**Request**
|
|
```json
|
|
{
|
|
"modelId": "home-model",
|
|
"samples": [
|
|
{
|
|
"sensor_id": "sensor.kitchen",
|
|
"values": {"temperature": 21.0},
|
|
"label": "occupied"
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
**Antwort**
|
|
```json
|
|
{
|
|
"model_id": "home-model",
|
|
"supported_sensors": ["sensor.kitchen"],
|
|
"replaced": false
|
|
}
|
|
```
|
|
|
|
### `POST /ml/batch`
|
|
|
|
Batch-Vorhersage für mehrere Sensorwerte.
|
|
|
|
**Request**
|
|
```json
|
|
{
|
|
"requests": [
|
|
{
|
|
"modelId": "default",
|
|
"sensor_id": "sensor.kitchen",
|
|
"values": {"temperature": 21.0}
|
|
},
|
|
{
|
|
"modelId": "default",
|
|
"sensor_id": "sensor.bedroom",
|
|
"values": {"temperature": 18.5}
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
**Antwort**
|
|
```json
|
|
{
|
|
"predictions": [
|
|
{
|
|
"model_id": "default",
|
|
"sensor_id": "sensor.kitchen",
|
|
"prediction": "default:sensor.kitchen:{'temperature': 21.0}"
|
|
},
|
|
{
|
|
"model_id": "default",
|
|
"sensor_id": "sensor.bedroom",
|
|
"prediction": "default:sensor.bedroom:{'temperature': 18.5}"
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
## Fehlerfälle
|
|
|
|
- `404 Not Found`: Modell nicht registriert.
|
|
- `422 Unprocessable Content`: Sensor wird vom Modell nicht unterstützt oder Eingabe ist ungültig.
|
|
- `503 Service Unavailable`: Registry ist nicht initialisiert.
|
|
|
|
## Betrieb
|
|
|
|
Die produktive App lädt Artefakte aus `SILLYHOME_MODEL_STORE`. Neue Artefakte
|
|
werden über `/ml/retrain`, `RetrainingService` oder direkt über
|
|
`ModelRegistry.register(...)` registriert. Die Registry speichert validiertes
|
|
JSON atomisch und lädt es beim Neustart. Die API sollte nur in einem
|
|
vertrauenswürdigen Netz oder hinter einem authentifizierenden Reverse Proxy
|
|
erreichbar sein.
|
|
|
|
## Verweise
|
|
|
|
- `app/ml/predictor.py`
|
|
- `app/ml/retraining.py`
|
|
- `app/ml/registry/model_registry.py`
|
|
- `backend/routes/ml.py`
|