diff --git a/backend/ai_server.py b/backend/ai_server.py index 5dc135d..ffdce96 100644 --- a/backend/ai_server.py +++ b/backend/ai_server.py @@ -1597,6 +1597,33 @@ def videomae_model_status() -> dict: } +def detector_model_status(load: bool = False) -> dict: + current_model = get_model() if load else model + names = getattr(current_model, "names", {}) or {} if current_model is not None else {} + + expected_text = str(DEFAULT_MODEL_PATH) + exists = False + error = _MODEL_ERROR + + try: + expected = resolve_model_path() + expected_text = str(expected) + exists = True + except Exception as exc: + if not error: + error = str(exc) + + return { + "modelAvailable": exists, + "modelLoaded": current_model is not None, + "model": _MODEL_PATH or (expected_text if exists else ""), + "modelError": error, + "expectedModel": expected_text, + "classCount": len(names), + "classes": list(names.values())[:80] if isinstance(names, dict) else names, + } + + @app.post("/predict-batch", dependencies=[Depends(require_ai_server_auth)]) def predict_batch(req: PredictBatchRequest): paths = [str(path).strip() for path in req.paths if str(path).strip()] @@ -1707,23 +1734,15 @@ def predict_position_clips(req: PredictPositionClipsRequest): @app.get("/health", dependencies=[Depends(require_ai_server_auth)]) def health(): - current_model = get_model() - names = getattr(current_model, "names", {}) or {} if current_model is not None else {} - status_payload = { "ok": True, "ready": True, - "modelAvailable": current_model is not None, - "model": _MODEL_PATH, - "modelError": _MODEL_ERROR, - "expectedModel": str(DEFAULT_MODEL_PATH), "trainingRoot": str(TRAINING_ROOT), - "classCount": len(names), - "classes": list(names.values())[:80] if isinstance(names, dict) else names, "labelConfig": str(DETECTION_LABELS_PATH) if DETECTION_LABELS_PATH else "", "labelError": _LABEL_ERROR, } + status_payload.update(detector_model_status(load=False)) status_payload.update(pose_model_status()) status_payload.update(videomae_model_status()) return status_payload @@ -1756,23 +1775,15 @@ def reload_model(): _VIDEOMAE_DEVICE_ACTIVE = "" DETECTION_LABELS_PATH = None - current_model = get_model() - names = getattr(current_model, "names", {}) or {} if current_model is not None else {} - status_payload = { "ok": True, "ready": True, - "modelAvailable": current_model is not None, - "model": _MODEL_PATH, - "modelError": _MODEL_ERROR, - "expectedModel": str(DEFAULT_MODEL_PATH), "trainingRoot": str(TRAINING_ROOT), - "classCount": len(names), - "classes": list(names.values())[:80] if isinstance(names, dict) else names, "labelConfig": str(DETECTION_LABELS_PATH) if DETECTION_LABELS_PATH else "", "labelError": _LABEL_ERROR, } + status_payload.update(detector_model_status(load=True)) status_payload.update(pose_model_status()) status_payload.update(videomae_model_status()) return status_payload diff --git a/backend/dist/nsfwapp-linux-amd64 b/backend/dist/nsfwapp-linux-amd64 index 3b43f25..fb14fbc 100644 Binary files a/backend/dist/nsfwapp-linux-amd64 and b/backend/dist/nsfwapp-linux-amd64 differ diff --git a/backend/dist/nsfwapp.exe b/backend/dist/nsfwapp.exe index 010066f..ba0ba25 100644 Binary files a/backend/dist/nsfwapp.exe and b/backend/dist/nsfwapp.exe differ diff --git a/backend/dist/nsfwapp_amd64.deb b/backend/dist/nsfwapp_amd64.deb index dbe5cee..4554c3b 100644 Binary files a/backend/dist/nsfwapp_amd64.deb and b/backend/dist/nsfwapp_amd64.deb differ diff --git a/backend/server.go b/backend/server.go index 2585f9b..88ad2e1 100644 --- a/backend/server.go +++ b/backend/server.go @@ -633,10 +633,7 @@ func startAIServer(ctx context.Context) (*aiServerProcess, error) { close(proc.done) }() - waitCtx, cancel := context.WithTimeout(ctx, 30*time.Second) - defer cancel() - - if err := waitForAIServer(waitCtx, aiServerURL(), 30*time.Second); err != nil { + if err := waitForAIServer(ctx, aiServerURL(), 120*time.Second); err != nil { appLogln("⚠️ AI Server noch nicht bereit:", err) // Nicht hart abbrechen. Deine Analyse kann auf den Fallback gehen. return proc, nil