Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/core/error.ts
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ export class APIError<
return new APIConnectionError({ message, cause: castToError(errorResponse) });
}

const error = (errorResponse as Record<string, any>)?.['error'];
const error = (errorResponse as Record<string, any>)?.['error'] ?? errorResponse;

if (status === 400) {
return new BadRequestError(status, error, message, headers);
Expand Down
51 changes: 51 additions & 0 deletions tests/error.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
import { APIError, BadRequestError, UnprocessableEntityError } from 'openai/core/error';

describe('APIError.generate', () => {
const headers = new Headers({ 'x-request-id': 'req_123' });

test('extracts error from standard OpenAI error response', () => {
const err = APIError.generate(
422,
{ error: { message: 'Invalid model', type: 'invalid_request_error', code: 'model_not_found' } },
undefined,
headers,
);
expect(err).toBeInstanceOf(UnprocessableEntityError);
expect(err.message).toContain('Invalid model');
expect(err.code).toBe('model_not_found');
expect(err.type).toBe('invalid_request_error');
});

test('falls back to entire response body when "error" field is missing', () => {
const err = APIError.generate(
422,
{ detail: '422: The model gpt-5-gibberish does not exist.' },
undefined,
headers,
);
expect(err).toBeInstanceOf(UnprocessableEntityError);
expect(err.message).not.toContain('(no body)');
expect(err.message).toContain('gpt-5-gibberish');
});

test('falls back to response body with message field (non-standard)', () => {
const err = APIError.generate(
400,
{ message: 'Something went wrong', code: 'bad_request' },
undefined,
headers,
);
expect(err).toBeInstanceOf(BadRequestError);
expect(err.message).toContain('Something went wrong');
});

test('still shows "(no body)" when response is truly empty', () => {
const err = APIError.generate(422, undefined, undefined, headers);
expect(err.message).toContain('(no body)');
});

test('uses errMessage string fallback when JSON parsing fails', () => {
const err = APIError.generate(422, undefined, 'raw error text', headers);
expect(err.message).toContain('raw error text');
});
});