{"record":{"id":"134dcfa8ec35c839","repo":"jamiepine/voicebox","slug":"no-cuda-backend-found-to-delete","errorCode":null,"errorMessage":"No CUDA backend found to delete","messagePattern":"No CUDA backend found to delete","errorType":"http","errorClass":"HTTPException","httpStatus":404,"severity":"warning","filePath":"backend/routes/cuda.py","lineNumber":64,"sourceCode":"\n    create_background_task(_download())\n    return {\"message\": \"CUDA backend download started\", \"progress_key\": \"cuda-backend\"}\n\n\n@router.delete(\"/backend/cuda\")\nasync def delete_cuda_backend():\n    \"\"\"Delete the downloaded CUDA backend binary.\"\"\"\n    from ..services import cuda\n\n    if cuda.is_cuda_active():\n        raise HTTPException(\n            status_code=409,\n            detail=\"Cannot delete CUDA backend while it is active. Switch to CPU first.\",\n        )\n\n    deleted = await cuda.delete_cuda_binary()\n    if not deleted:\n        raise HTTPException(status_code=404, detail=\"No CUDA backend found to delete\")\n\n    return {\"message\": \"CUDA backend deleted\"}\n\n\n@router.get(\"/backend/cuda-progress\")\nasync def get_cuda_download_progress():\n    \"\"\"Get CUDA backend download progress via Server-Sent Events.\"\"\"\n    progress_manager = get_progress_manager()\n\n    async def event_generator():\n        async for event in progress_manager.subscribe(\"cuda-backend\"):\n            yield event\n\n    return StreamingResponse(\n        event_generator(),\n        media_type=\"text/event-stream\",\n        headers={\n            \"Cache-Control\": \"no-cache\",","sourceCodeStart":46,"sourceCodeEnd":82,"githubUrl":"https://github.com/jamiepine/voicebox/blob/51f49dea198384b4eb6087b72c17057c6eb1c1cd/backend/routes/cuda.py#L46-L82","documentation":"HTTP 404 raised by DELETE /backend/cuda when cuda.delete_cuda_binary() returns False. The service returns False when the CUDA directory does not exist or is empty (no files to remove). The endpoint interprets that as 'nothing to delete'.","triggerScenarios":"Calling DELETE /backend/cuda when no CUDA backend was ever downloaded, or after it was already deleted.","commonSituations":"User clicks delete twice; cleanup script runs against a fresh install; a prior delete already removed the directory.","solutions":["Treat a 404 here as success (the backend is already absent).","Check GET /backend/cuda status.available before offering delete.","Make the client delete idempotent: ignore 404."],"exampleFix":"// before\nconst r = await fetch('/backend/cuda', { method: 'DELETE' });\nif (!r.ok) throw new Error('delete failed');\n// after\nconst r = await fetch('/backend/cuda', { method: 'DELETE' });\nif (r.status === 404) { /* nothing to delete */ }\nelse if (!r.ok) throw new Error('delete failed');","handlingStrategy":"try-catch","validationCode":"const status = await fetch('/backend/cuda').then(r => r.json());\nif (!status.available) throw new Error('nothing to delete');","typeGuard":null,"tryCatchPattern":"const r = await fetch('/backend/cuda', { method:'DELETE' });\nif (r.status === 404) { /* already absent — success */ }","preventionTips":["Treat 404 on this delete as success.","Check status.available before offering delete.","Dedupe repeated delete requests."],"tags":["cuda","http","not-found","state","fastapi"],"backgroundTag":null,"analyzedSha":"51f49dea198384b4eb6087b72c17057c6eb1c1cd","analyzedAt":"2026-08-12T16:51:42.824Z","schemaVersion":2},"datasetVersion":"2026-08-12T23:17:12.415Z"}