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

  1. Check if the file was already deleted — this error is often benign for already-removed files.
  2. Verify file.file_id is a valid OpenAI file identifier and matches a currently existing file via openai.files.retrieve(file_id).
  3. Update the OpenAI SDK to the latest version in case the response contract changed.
  4. 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

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


AI-assisted analysis of danny-avila/LibreChat@5ff282f900 (2026-08-12). Data as JSON: /api/errors/6eeaecb3de183680. Report an issue: GitHub.