From 475f718efb29b64c93171da57f8bf20edf79965e Mon Sep 17 00:00:00 2001 From: SuYao Date: Mon, 24 Nov 2025 10:57:51 +0800 Subject: [PATCH] fix: improve error handling and display in AiSdkToChunkAdapter (#11423) * fix: improve error handling and display in AiSdkToChunkAdapter * fix: test --- .../src/aiCore/chunk/AiSdkToChunkAdapter.ts | 15 +++--- .../src/utils/__tests__/error.test.ts | 51 +++++++------------ src/renderer/src/utils/error.ts | 2 +- 3 files changed, 25 insertions(+), 43 deletions(-) diff --git a/src/renderer/src/aiCore/chunk/AiSdkToChunkAdapter.ts b/src/renderer/src/aiCore/chunk/AiSdkToChunkAdapter.ts index 544ec443aa..5de2ac3453 100644 --- a/src/renderer/src/aiCore/chunk/AiSdkToChunkAdapter.ts +++ b/src/renderer/src/aiCore/chunk/AiSdkToChunkAdapter.ts @@ -386,14 +386,13 @@ export class AiSdkToChunkAdapter { case 'error': this.onChunk({ type: ChunkType.ERROR, - error: - chunk.error instanceof AISDKError - ? chunk.error - : new ProviderSpecificError({ - message: formatErrorMessage(chunk.error), - provider: 'unknown', - cause: chunk.error - }) + error: AISDKError.isInstance(chunk.error) + ? chunk.error + : new ProviderSpecificError({ + message: formatErrorMessage(chunk.error), + provider: 'unknown', + cause: chunk.error + }) }) break diff --git a/src/renderer/src/utils/__tests__/error.test.ts b/src/renderer/src/utils/__tests__/error.test.ts index 1f2afab9f7..ec283c73b1 100644 --- a/src/renderer/src/utils/__tests__/error.test.ts +++ b/src/renderer/src/utils/__tests__/error.test.ts @@ -50,20 +50,17 @@ describe('error', () => { }) describe('formatErrorMessage', () => { - it('should format error with indentation and header', () => { + it('should format error with message directly when message exists', () => { console.error = vi.fn() const error = new Error('Test error') const result = formatErrorMessage(error) - expect(result).toContain('Error Details:') - expect(result).toContain(' {') - expect(result).toContain(' "message": "Test error"') - expect(result).toContain(' }') - expect(result).not.toContain('"stack":') + // When error has a message property, it returns the message directly + expect(result).toBe('Test error') }) - it('should remove sensitive information and format with proper indentation', () => { + it('should return message directly when error object has message property', () => { console.error = vi.fn() const error = { @@ -75,16 +72,11 @@ describe('error', () => { const result = formatErrorMessage(error) - expect(result).toContain('Error Details:') - expect(result).toContain(' {') - expect(result).toContain(' "message": "API error"') - expect(result).toContain(' }') - expect(result).not.toContain('Authorization') - expect(result).not.toContain('stack') - expect(result).not.toContain('request_id') + // When error has a message property, it returns the message directly + expect(result).toBe('API error') }) - it('should handle errors during formatting with simple error message', () => { + it('should handle errors during formatting and return placeholder message', () => { console.error = vi.fn() const problematicError = { @@ -94,32 +86,23 @@ describe('error', () => { } const result = formatErrorMessage(problematicError) - expect(result).toContain('Error Details:') - expect(result).toContain('"message": ""') + // When message property throws error, it's caught and set to '' + expect(result).toBe('') }) - it('should handle non-serializable errors with simple error message', () => { + it('should format error object without message property with full details', () => { console.error = vi.fn() - const nonSerializableError = { - toString() { - throw new Error('Cannot convert to string') - } + const errorWithoutMessage = { + code: 500, + status: 'Internal Server Error' } - try { - Object.defineProperty(nonSerializableError, 'toString', { - get() { - throw new Error('Cannot access toString') - } - }) - } catch (e) { - // Ignore - } - - const result = formatErrorMessage(nonSerializableError) + const result = formatErrorMessage(errorWithoutMessage) + // When no message property exists, it returns full error details expect(result).toContain('Error Details:') - expect(result).toContain('"toString": ""') + expect(result).toContain('"code": 500') + expect(result).toContain('"status": "Internal Server Error"') }) }) diff --git a/src/renderer/src/utils/error.ts b/src/renderer/src/utils/error.ts index ebf9671fbb..d4ea2979e2 100644 --- a/src/renderer/src/utils/error.ts +++ b/src/renderer/src/utils/error.ts @@ -69,7 +69,7 @@ export function formatErrorMessage(error: unknown): string { .split('\n') .map((line) => ` ${line}`) .join('\n') - return `Error Details:\n${formattedJson}` + return detailedError.message ? detailedError.message : `Error Details:\n${formattedJson}` } export function getErrorMessage(error: unknown): string {