danny-avila/LibreChat · error
OpenAI returned `false` for deleted status
Error message
OpenAI returned `false` for deleted status
What it means
Thrown by deleteOpenAIFile when the OpenAI Files API responds to a deletion request with { deleted: false } instead of { deleted: true }. The OpenAI SDK's files.del() method returns an object with a deleted boolean; a false value means the API acknowledged the request but did not confirm deletion. This is distinct from an HTTP error (which would throw from the SDK itself) — the API returned a 200-level response with a negative result.
Source
Thrown at api/server/services/Files/OpenAI/crud.js:53
await sleep(sleepTime);
}
return isImage ? { ...uploadedFile, height, width } : uploadedFile;
}
/**
* Deletes a file previously uploaded to OpenAI.
*
* @param {ServerRequest} req - The request object from Express.
* @param {MongoFile} file - The database representation of the uploaded file.
* @param {OpenAI} openai - The initialized OpenAI client.
* @returns {Promise<void>}
*/
async function deleteOpenAIFile(req, file, openai) {
try {
const res = await openai.files.del(file.file_id);
if (!res.deleted) {
throw new Error('OpenAI returned `false` for deleted status');
}
logger.debug(
`[deleteOpenAIFile] User ${req.user.id} successfully deleted file "${file.file_id}" from OpenAI`,
);
} catch (error) {
logger.error('[deleteOpenAIFile] Error deleting file from OpenAI: ' + error.message);
throw error;
}
}
/**
* Retrieves a readable stream for a file from local storage.
*
* @param {string} file_id - The file_id.
* @param {OpenAI} openai - The initialized OpenAI client.
* @returns {Promise<ReadableStream>} A readable stream of the file.
*/
async function getOpenAIFileStream(file_id, openai) {View on GitHub (pinned to 5ff282f900)
Solutions
- Check if the file was already deleted — this error is often benign for already-removed files.
- Verify file.file_id is a valid OpenAI file identifier and matches a currently existing file via openai.files.retrieve(file_id).
- Update the OpenAI SDK to the latest version in case the response contract changed.
- Wrap the call and treat deleted: false as idempotent success if the file no longer exists on retrieval.
Example fix
// before
await deleteOpenAIFile(req, file, openai);
// after — treat already-deleted as success
try {
await deleteOpenAIFile(req, file, openai);
} catch (error) {
if (error.message.includes('returned `false` for deleted status')) {
try {
await openai.files.retrieve(file.file_id);
} catch (retrieveError) {
if (retrieveError.status === 404) {
logger.info(`File ${file.file_id} already deleted from OpenAI`);
return;
}
}
}
throw error;
} Defensive patterns
Strategy: try-catch
Validate before calling
try {
await openai.files.retrieve(file.file_id);
} catch (error) {
if (error.status === 404) {
// file already deleted — safe to skip
}
} Try / catch
try {
await deleteOpenAIFile(req, file, openai);
} catch (error) {
if (error.message.includes('returned `false` for deleted status')) {
try {
await openai.files.retrieve(file.file_id);
} catch (retrieveError) {
if (retrieveError.status === 404) {
logger.info(`File ${file.file_id} already deleted from OpenAI`);
return; // treat as success
}
}
}
throw error;
} Prevention
- Treat deleted: false as idempotent when the file is confirmed gone via retrieve returning 404.
- Keep file.file_id in sync with OpenAI's file registry — run periodic reconciliation.
- Update the OpenAI SDK to the latest version to ensure response contract compatibility.
- Log deletion attempts and outcomes for audit trails.
When it happens
Trigger: Calling deleteOpenAIFile(req, file, openai) where openai.files.del(file.file_id) resolves successfully but the response body contains deleted: false. This can occur if the file_id is invalid, the file was already deleted, or the OpenAI API has a transient issue returning the correct status.
Common situations: A file was already deleted from OpenAI (e.g., via a previous request or automatic cleanup) and the API returns deleted: false on a redundant deletion. Or the file_id stored in the database is stale, pointing to a file that no longer exists on OpenAI's servers. Or an OpenAI API version change altered the response contract.
Related errors
- An error occurred during file deletion.
- Missing DALLE_API_KEY environment variable.
- [${req.baseUrl}] Invalid version: ${version}
- Unexpected run status ${run.status}.\nFull run info:\n\n${ru
- no_user_key
AI-assisted analysis of danny-avila/LibreChat@5ff282f900 (2026-08-12).
Data as JSON: /api/errors/6eeaecb3de183680.
Report an issue: GitHub.