UNPKG

@lobehub/chat

Version:

Lobe Chat - an open-source, high-performance chatbot framework that supports speech synthesis, multimodal, and extensible Function Call plugin system. Supports one-click free deployment of your private ChatGPT/LLM web application.

145 lines (119 loc) 4.2 kB
import OpenAI from 'openai'; import { describe, expect, it } from 'vitest'; import { AgentRuntimeErrorType } from '../types/error'; import { handleOpenAIError } from './handleOpenAIError'; describe('handleOpenAIError', () => { describe('OpenAI APIError handling', () => { it('should handle OpenAI APIError with error object', () => { const apiError = new OpenAI.APIError( 472, { error: { message: 'API error', type: 'invalid_request' } }, 'test-message', { status: 400 } as any, ); const result = handleOpenAIError(apiError); expect(result).toEqual({ errorResult: { error: { message: 'API error', type: 'invalid_request' } }, }); expect(result.RuntimeError).toBeUndefined(); }); it('should handle OpenAI APIError with cause', () => { const cause = { message: 'Network error', code: 'ECONNRESET' }; const apiError = new OpenAI.APIError(472, null as any, 'test-message', { status: 500, } as any); (apiError as any).cause = cause; const result = handleOpenAIError(apiError); expect(result).toEqual({ errorResult: cause, }); expect(result.RuntimeError).toBeUndefined(); }); it('should handle OpenAI APIError without error or cause', () => { const headers = { 'content-type': 'application/json' }; const apiError = new OpenAI.APIError(472, null as any, 'test-message', { status: 401, headers, } as any); const result = handleOpenAIError(apiError); expect(result.errorResult).toEqual({ headers: { headers, status: 401 }, status: 472, }); expect(result.RuntimeError).toBeUndefined(); }); it('should handle OpenAI APIError with both error and cause', () => { const errorObject = { message: 'API error', type: 'rate_limit' }; const cause = { message: 'Rate limit exceeded' }; const apiError = new OpenAI.APIError(472, { error: errorObject }, 'test-message', { status: 429, } as any); (apiError as any).cause = cause; const result = handleOpenAIError(apiError); // Should prioritize error over cause expect(result).toEqual({ errorResult: { error: errorObject }, }); }); }); describe('Non-OpenAI error handling', () => { it('should handle generic Error', () => { const error = new Error('Generic error'); error.cause = { details: 'Error details' }; const result = handleOpenAIError(error); expect(result).toEqual({ RuntimeError: AgentRuntimeErrorType.AgentRuntimeError, errorResult: { cause: { details: 'Error details' }, message: 'Generic error', name: 'Error', }, }); }); it('should handle Error without cause', () => { const error = new Error('Simple error'); const result = handleOpenAIError(error); expect(result).toEqual({ RuntimeError: AgentRuntimeErrorType.AgentRuntimeError, errorResult: { cause: undefined, message: 'Simple error', name: 'Error', }, }); }); it('should handle custom Error types', () => { class CustomError extends Error { constructor(message: string) { super(message); this.name = 'CustomError'; } } const error = new CustomError('Custom error message'); const result = handleOpenAIError(error); expect(result).toEqual({ RuntimeError: AgentRuntimeErrorType.AgentRuntimeError, errorResult: { cause: undefined, message: 'Custom error message', name: 'CustomError', }, }); }); it('should handle non-Error objects', () => { const errorObject = { message: 'Object error', code: 'CUSTOM_ERROR', }; const result = handleOpenAIError(errorObject); expect(result).toEqual({ RuntimeError: AgentRuntimeErrorType.AgentRuntimeError, errorResult: { cause: undefined, message: 'Object error', name: undefined, }, }); }); }); });