can1357/oh-my-pi · warning
OpenAI Files API delete failed with HTTP ${response.status}
Error message
OpenAI Files API delete failed with HTTP ${response.status} What it means
Thrown when the DELETE request reached OpenAI but returned a non-2xx status. The most common case is 404 — the file was already deleted — followed by 401/403 (auth) and 5xx (outage). The status is interpolated into the message.
Source
Thrown at packages/coding-agent/src/blob-broker/provider-files-openai.ts:141
},
};
},
async delete(handle: ProviderFileHandle): Promise<void> {
if (handle.provider !== "openai" || typeof handle.id !== "string" || handle.id.trim().length === 0) {
throw new Error("Cannot delete an invalid OpenAI file handle");
}
let response: Response;
try {
response = await request(`${OPENAI_FILES_URL}/${encodeURIComponent(handle.id)}`, {
method: "DELETE",
headers: { Authorization: authorization },
});
} catch {
throw new Error("OpenAI Files API delete request failed");
}
if (!response.ok) {
throw new Error(`OpenAI Files API delete failed with HTTP ${response.status}`);
}
},
};
}
View on GitHub (pinned to 9690622007)
Solutions
- Treat HTTP 404 as success — the goal (file gone) is already achieved; skip or log-and-continue
- For 401/403, verify the same credential used for the upload is used for the delete
- For 429/5xx, retry with exponential backoff
- If persists, check the OpenAI dashboard whether the file exists under the expected project/org
Example fix
// before: 404 on already-deleted file crashes cleanup
await client.delete(handle);
// after
try {
await client.delete(handle);
} catch (err) {
const status = Number(/HTTP (\d{3})/.exec(String(err.message))?.[1] ?? 0);
if (status !== 404) throw err; // idempotent delete: 404 means goal achieved
} Defensive patterns
Strategy: try-catch
Type guard
function isAlreadyDeleted(err: unknown): boolean {
const m = /HTTP (\d{3})/.exec(err instanceof Error ? err.message : "");
return m?.[1] === "404";
} Try / catch
try {
await client.delete(handle);
} catch (err) {
if (isAlreadyDeleted(err)) return; // file already gone: success
if (isRetryableHttpStatus(err)) return queueRetry(() => client.delete(handle));
throw err;
} Prevention
- Guard against double-cleanup with a deleted-handle set
- Reuse the exact credential/org that performed the upload for the delete
- Retry 429/5xx deletes with backoff
- Log the interpolated HTTP status for diagnosis
When it happens
Trigger: client.delete() with response.ok === false: 404 (file already gone / never existed), 401 (bad key), 403 (key can't access that org's files), 429/5xx (rate limit/outage).
Common situations: Double-cleanup of the same handle (404); key rotated between upload and delete (401); deleting a file uploaded under a different org/project key (404/403).
Related errors
- OpenAI Files API upload failed with HTTP ${response.status}
- V2 remote compaction failed (${response.status} ${response.s
- HTTP request failed. status=${response.status}; url=${url};
- OpenAI stream response has no body (status ${response.status
- OpenAI Files API delete request failed
AI-assisted analysis of can1357/oh-my-pi@9690622007 (2026-08-31).
Data as JSON: /api/errors/381904fd703d2a4b.
Report an issue: GitHub.