jamiepine/voicebox · warning · HTTPException

No ROCm backend found to delete

Error message

No ROCm backend found to delete

What it means

Returned by DELETE /backend/rocm when rocm.delete_rocm_binary() returns a falsy result (HTTP 404). This means the active check passed but no binary file was found on disk to delete — the ROCm backend is not installed at the expected path.

Source

Thrown at backend/routes/rocm.py:57

    create_background_task(_download())
    return {"message": "ROCm backend download started", "progress_key": rocm.PROGRESS_KEY}


@router.delete("/backend/rocm")
async def delete_rocm_backend():
    """Delete the downloaded ROCm backend binary."""
    from ..services import rocm

    if rocm.is_rocm_active():
        raise HTTPException(
            status_code=409,
            detail="Cannot delete ROCm backend while it is active. Switch to CPU first.",
        )

    deleted = await rocm.delete_rocm_binary()
    if not deleted:
        raise HTTPException(status_code=404, detail="No ROCm backend found to delete")

    return {"message": "ROCm backend deleted"}


@router.get("/backend/rocm-progress")
async def get_rocm_download_progress():
    """Get ROCm backend download progress via Server-Sent Events."""
    progress_manager = get_progress_manager()

    async def event_generator():
        async for event in progress_manager.subscribe("rocm-backend"):
            yield event

    return StreamingResponse(
        event_generator(),
        media_type="text/event-stream",
        headers={
            "Cache-Control": "no-cache",

View on GitHub (pinned to 51f49dea19)

Solutions

  1. Confirm via GET /backend/status (or equivalent) whether a ROCm binary path exists before deleting.
  2. Treat 404 as success-equivalent if the goal is 'ensure ROCm is removed'.
  3. If the UI shows ROCm as present, refresh backend status to reconcile.
  4. Avoid issuing DELETE when the binary is known-absent; guard with an existence check.

Example fix

// before
await api.delete('/backend/rocm');

// after
const present = await rocmBinaryExists();
if (!present) return { removed: true, alreadyAbsent: true };
await api.delete('/backend/rocm');
Defensive patterns

Strategy: fallback

Validate before calling

async function rocmBinaryPresent() {
  const s = await (await fetch('/api/backend/rocm-status')).json();
  return !!s.installed;
}

Type guard

function isRocmInstalled(s) { return !!s && s.installed === true; }

Try / catch

try { await api.delete('/backend/rocm'); }
catch (e) { if (e.response?.status === 404) return { removed: true }; throw e; }

Prevention

When it happens

Trigger: DELETE /backend/rocm when the binary was never downloaded, was already deleted, or was manually removed from the filesystem outside the app. The progress entry is inactive so the active-check passes, but the file is absent.

Common situations: User deleted the binary by hand. A previous successful delete left stale UI state suggesting the backend exists. Fresh install where download never completed.

Related errors


AI-assisted analysis of jamiepine/voicebox@51f49dea19 (2026-08-12). Data as JSON: /api/errors/7aac3b250e234607. Report an issue: GitHub.