From c5afaa3629cd2cdd614d2e810ef9df94b3ce0c42 Mon Sep 17 00:00:00 2001 From: icarus Date: Thu, 4 Sep 2025 01:37:58 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E9=94=99=E8=AF=AF=E5=A4=84=E7=90=86):=20?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=BA=8F=E5=88=97=E5=8C=96=E9=94=99=E8=AF=AF?= =?UTF-8?q?=E7=B1=BB=E5=9E=8B=E6=A3=80=E6=9F=A5=E5=87=BD=E6=95=B0=E5=B9=B6?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E9=94=99=E8=AF=AF=E6=A0=BC=E5=BC=8F=E5=8C=96?= =?UTF-8?q?=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加 isSerializedError 类型检查函数用于判断序列化错误 更新 formatError 和 formatAiSdkError 函数以处理序列化错误类型 修改 ErrorBlock 组件使用新的类型检查函数替代 instanceof 检查 --- .../src/pages/home/Messages/Blocks/ErrorBlock.tsx | 6 +++--- src/renderer/src/types/error.ts | 3 +++ src/renderer/src/utils/error.ts | 14 +++++++++----- 3 files changed, 15 insertions(+), 8 deletions(-) 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` }