fix: Preserve OpenAI files on quota rejection

This commit is contained in:
Danny Avila 2026-05-20 12:32:44 -04:00
parent adc92b58d5
commit d9ad8db714
2 changed files with 37 additions and 1 deletions

View file

@ -1219,7 +1219,7 @@ const processOpenAIFile = async ({
};
if (saveFile) {
await createFileWithStorageLimit(request, file, true, { openai });
await createFileWithStorageLimit(request, file, true, { cleanup: false });
} else if (updateUsage) {
try {
await db.updateFileUsage({ file_id });

View file

@ -1392,6 +1392,42 @@ describe('generated image quota paths', () => {
);
});
it('retrieveAndProcessFile does not delete existing OpenAI files when metadata quota rejects', async () => {
const error = Object.assign(new Error('storage limit exceeded.'), {
code: 'FILE_STORAGE_LIMIT_EXCEEDED',
status: 413,
});
const req = {
user: { id: 'user-123', tenantId: 'tenant-a' },
body: { endpoint: EModelEndpoint.assistants, model: 'gpt-4o' },
config: { fileConfig: { storageLimit: 1 } },
};
const openai = {
baseURL: 'https://api.openai.test',
files: {
retrieve: jest.fn().mockResolvedValue({
bytes: 512,
filename: 'remote.txt',
purpose: 'assistants_output',
}),
},
};
const deleteFile = jest.fn();
getStrategyFunctions.mockReturnValue({ deleteFile });
assertFileStorageLimit.mockRejectedValueOnce(error);
await expect(
retrieveAndProcessFile({
openai,
client: { req },
file_id: 'openai-file-id',
}),
).rejects.toThrow('storage limit exceeded');
expect(deleteFile).not.toHaveBeenCalled();
expect(db.createFile).not.toHaveBeenCalled();
});
it('retrieveAndProcessFile rejects over-limit OpenAI image outputs before metadata persistence', async () => {
const error = Object.assign(new Error('storage limit exceeded.'), {
code: 'FILE_STORAGE_LIMIT_EXCEEDED',