diff --git a/src/renderer/src/pages/home/Messages/Blocks/ErrorBlock.tsx b/src/renderer/src/pages/home/Messages/Blocks/ErrorBlock.tsx index 43b6b40472..62b36202c5 100644 --- a/src/renderer/src/pages/home/Messages/Blocks/ErrorBlock.tsx +++ b/src/renderer/src/pages/home/Messages/Blocks/ErrorBlock.tsx @@ -7,13 +7,13 @@ import { removeBlocksThunk } from '@renderer/store/thunk/messageThunk' import { isSerializedAiSdkAPICallError, isSerializedAiSdkError, + isSerializedError, SerializedAiSdkAPICallError, SerializedAiSdkError, SerializedError } from '@renderer/types/error' import type { ErrorMessageBlock, Message } from '@renderer/types/newMessage' import { formatAiSdkError, formatError, safeToString } from '@renderer/utils/error' -import { AISDKError } from 'ai' import { Alert as AntdAlert, Button, Modal } from 'antd' import React, { useState } from 'react' import { Trans, useTranslation } from 'react-i18next' @@ -143,9 +143,9 @@ const ErrorDetailModal: React.FC = ({ open, onClose, erro const copyErrorDetails = () => { if (!error) return let errorText: string - if (AISDKError.isInstance(error)) { + if (isSerializedAiSdkError(error)) { errorText = formatAiSdkError(error) - } else if (error instanceof Error) { + } else if (isSerializedError(error)) { errorText = formatError(error) } else { // fallback diff --git a/src/renderer/src/types/error.ts b/src/renderer/src/types/error.ts index fd1eb30a8f..2439eaa123 100644 --- a/src/renderer/src/types/error.ts +++ b/src/renderer/src/types/error.ts @@ -6,6 +6,9 @@ export interface SerializedError { stack: string | null [key: string]: Serializable } +export const isSerializedError = (error: Record): error is SerializedAiSdkError => { + return 'name' in error && 'message' in error && 'stack' in error +} export interface SerializedAiSdkError extends SerializedError { readonly cause: string | null } diff --git a/src/renderer/src/utils/error.ts b/src/renderer/src/utils/error.ts index 7953c8ca1f..abb5cb6e6a 100644 --- a/src/renderer/src/utils/error.ts +++ b/src/renderer/src/utils/error.ts @@ -1,6 +1,10 @@ import { loggerService } from '@logger' -import { AiSdkErrorUnion } from '@renderer/types/aiCoreTypes' -import { SerializedAiSdkAPICallError, SerializedError } from '@renderer/types/error' +import { + isSerializedAiSdkAPICallError, + SerializedAiSdkAPICallError, + SerializedAiSdkError, + SerializedError +} from '@renderer/types/error' import { AISDKError, APICallError } from 'ai' import { t } from 'i18next' import z from 'zod' @@ -199,16 +203,16 @@ function getCircularReplacer() { } } -export function formatError(error: Error): string { +export function formatError(error: SerializedError): string { return `${t('error.name')}: ${error.name}\n${t('error.message')}: ${error.message}\n${t('error.stack')}: ${error.stack}` } -export function formatAiSdkError(error: AiSdkErrorUnion): string { +export function formatAiSdkError(error: SerializedAiSdkError): string { let text = formatError(error) + '\n' if (error.cause) { text += `${t('error.cause')}: ${error.cause}\n` } - if (APICallError.isInstance(error)) { + if (isSerializedAiSdkAPICallError(error)) { if (error.statusCode) { text += `${t('error.statusCode')}: ${error.statusCode}\n` }