{"record":{"id":"f3a3563ebb396ad6","repo":"lfnovo/open-notebook","slug":"error-deleting-model-str-e","errorCode":null,"errorMessage":"Error deleting model: {str(e)}","messagePattern":"Error deleting model: (.+?)","errorType":"http","errorClass":"HTTPException","httpStatus":500,"severity":"error","filePath":"api/routers/models.py","lineNumber":279,"sourceCode":"\n@router.delete(\"/models/{model_id}\")\nasync def delete_model(model_id: str):\n    \"\"\"Delete a model configuration.\"\"\"\n    try:\n        model = await Model.get(model_id)\n\n        await model.delete()\n\n        return {\"message\": \"Model deleted successfully\"}\n    except HTTPException:\n        raise\n    except NotFoundError:\n        raise HTTPException(status_code=404, detail=\"Model not found\")\n    except OpenNotebookError:\n        raise\n    except Exception as e:\n        logger.error(f\"Error deleting model {model_id}: {str(e)}\")\n        raise HTTPException(status_code=500, detail=f\"Error deleting model: {str(e)}\")\n\n\n@router.post(\"/models/{model_id}/test\", response_model=ModelTestResponse)\nasync def test_model(model_id: str):\n    \"\"\"Test if a specific model is correctly configured and functional.\"\"\"\n    try:\n        model = await Model.get(model_id)\n        if not model:\n            raise HTTPException(status_code=404, detail=\"Model not found\")\n    except HTTPException:\n        raise\n    except OpenNotebookError:\n        raise\n    except Exception:\n        raise HTTPException(status_code=404, detail=\"Model not found\")\n\n    try:\n        success, message = await test_individual_model(model)","sourceCodeStart":261,"sourceCodeEnd":297,"githubUrl":"https://github.com/lfnovo/open-notebook/blob/a7de90d38aaf18ee85fd661854d35c11e44613e2/api/routers/models.py#L261-L297","documentation":"Catch-all 500 from DELETE /api/v1/models/{model_id} when deletion fails unexpectedly. HTTPException, NotFoundError, and OpenNotebookError are re-raised first; this branch catches anything else, typically a database error during model.delete().","triggerScenarios":"DELETE /models/{id} while SurrealDB is unreachable, or when deletion violates a dependency (model still referenced as a default) and the driver raises a non-domain exception.","commonSituations":"Deleting a model that is still assigned in DefaultModels; DB outage; transaction conflicts.","solutions":["Check API logs for 'Error deleting model {id}'","Unassign the model from defaults (update via PATCH defaults) before deleting","Verify DB connectivity and retry"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":"const defaults = await api.getDefaultModels();\nconst inUse = Object.values(defaults).includes(modelId);\nif (inUse) throw new Error('Reassign default before deleting');","typeGuard":null,"tryCatchPattern":"try { await api.deleteModel(id); } catch (e) { if (e.status === 500) { checkLogs(); unassignDefaults(); await retry(); } }","preventionTips":["Unassign a model from defaults before deleting it","Keep DB healthy","Read the logged inner exception"],"tags":["models","http-500","delete"],"backgroundTag":"internal-server-error","analyzedSha":"a7de90d38aaf18ee85fd661854d35c11e44613e2","analyzedAt":"2026-08-27T02:39:58.166Z","schemaVersion":2},"datasetVersion":"2026-08-27T03:17:27.898Z"}