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

  1. Treat HTTP 404 as success — the goal (file gone) is already achieved; skip or log-and-continue
  2. For 401/403, verify the same credential used for the upload is used for the delete
  3. For 429/5xx, retry with exponential backoff
  4. 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

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


AI-assisted analysis of can1357/oh-my-pi@9690622007 (2026-08-31). Data as JSON: /api/errors/381904fd703d2a4b. Report an issue: GitHub.