diff --git a/src/renderer/src/i18n/locales/en-us.json b/src/renderer/src/i18n/locales/en-us.json
index 6af1795e..1ff77199 100644
--- a/src/renderer/src/i18n/locales/en-us.json
+++ b/src/renderer/src/i18n/locales/en-us.json
@@ -172,6 +172,17 @@
"render": {
"title": "Render Error",
"description": "Failed to render formula. Please check if the formula format is correct"
+ },
+ "http": {
+ "400": "Request failed. Please check if the request parameters are correct. If you have changed the model settings, please reset them to the default settings",
+ "401": "Authentication failed. Please check if your API key is correct",
+ "403": "Access denied. Please check if your account is verified, or contact the service provider for more information",
+ "404": "Model not found or request path is incorrect",
+ "429": "Too many requests. Please try again later",
+ "500": "Server error. Please try again later",
+ "502": "Gateway error. Please try again later",
+ "503": "Service unavailable. Please try again later",
+ "504": "Gateway timeout. Please try again later"
}
},
"export": {
diff --git a/src/renderer/src/i18n/locales/ja-jp.json b/src/renderer/src/i18n/locales/ja-jp.json
index 2a0a7668..d9715914 100644
--- a/src/renderer/src/i18n/locales/ja-jp.json
+++ b/src/renderer/src/i18n/locales/ja-jp.json
@@ -167,6 +167,17 @@
"render": {
"title": "レンダリングエラー",
"description": "数式のレンダリングに失敗しました。数式の形式が正しいか確認してください"
+ },
+ "http": {
+ "400": "リクエストに失敗しました。リクエストパラメータが正しいか確認してください。モデルの設定を変更した場合は、デフォルトの設定にリセットしてください",
+ "401": "認証に失敗しました。APIキーが正しいか確認してください",
+ "403": "アクセスが拒否されました。アカウントが実名認証されているか確認してください。またはサービスプロバイダーに問い合わせてください",
+ "404": "モデルが見つからないか、リクエストパスが間違っています",
+ "429": "リクエストが多すぎます。後でもう一度試してください",
+ "500": "サーバーエラーが発生しました。後でもう一度試してください",
+ "502": "ゲートウェイエラーが発生しました。後でもう一度試してください",
+ "503": "サービスが利用できません。後でもう一度試してください",
+ "504": "ゲートウェイタイムアウトが発生しました。後でもう一度試してください"
}
},
"export": {
diff --git a/src/renderer/src/i18n/locales/ru-ru.json b/src/renderer/src/i18n/locales/ru-ru.json
index 647618b9..7454a4e1 100644
--- a/src/renderer/src/i18n/locales/ru-ru.json
+++ b/src/renderer/src/i18n/locales/ru-ru.json
@@ -167,6 +167,17 @@
"render": {
"title": "Ошибка рендеринга",
"description": "Не удалось рендерить формулу. Пожалуйста, проверьте, правильно ли формат формулы"
+ },
+ "http": {
+ "400": "Не удалось выполнить запрос. Пожалуйста, проверьте, правильно ли настроены параметры запроса. Если вы изменили настройки модели, пожалуйста, сбросьте их до значений по умолчанию",
+ "401": "Не удалось пройти аутентификацию. Пожалуйста, проверьте, правильно ли настроен ваш ключ API",
+ "403": "Доступ запрещен. Пожалуйста, проверьте, правильно ли настроены ваши учетные данные или обратитесь к поставщику услуг для получения дополнительной информации",
+ "404": "Модель не найдена или путь запроса неверен",
+ "429": "Слишком много запросов. Пожалуйста, попробуйте позже",
+ "500": "Серверная ошибка. Пожалуйста, попробуйте позже",
+ "502": "Серверная ошибка. Пожалуйста, попробуйте позже",
+ "503": "Серверная ошибка. Пожалуйста, попробуйте позже",
+ "504": "Серверная ошибка. Пожалуйста, попробуйте позже"
}
},
"export": {
diff --git a/src/renderer/src/i18n/locales/zh-cn.json b/src/renderer/src/i18n/locales/zh-cn.json
index 3c478c57..9860936b 100644
--- a/src/renderer/src/i18n/locales/zh-cn.json
+++ b/src/renderer/src/i18n/locales/zh-cn.json
@@ -173,6 +173,17 @@
"render": {
"title": "渲染错误",
"description": "渲染公式失败,请检查公式格式是否正确"
+ },
+ "http": {
+ "400": "请求错误,请检查请求参数是否正确。如果修改了模型设置,请重置到默认设置",
+ "401": "身份验证失败,请检查 API 密钥是否正确",
+ "403": "禁止访问,请检查是否实名认证,或联系服务商询问被禁止原因",
+ "404": "模型不存在或者请求路径错误",
+ "429": "请求过多,请稍后再试",
+ "500": "服务器错误,请稍后再试",
+ "502": "网关错误,请稍后再试",
+ "503": "服务不可用,请稍后再试",
+ "504": "网关超时,请稍后再试"
}
},
"export": {
diff --git a/src/renderer/src/i18n/locales/zh-tw.json b/src/renderer/src/i18n/locales/zh-tw.json
index e9da4f05..e9289d2d 100644
--- a/src/renderer/src/i18n/locales/zh-tw.json
+++ b/src/renderer/src/i18n/locales/zh-tw.json
@@ -172,6 +172,17 @@
"render": {
"title": "渲染錯誤",
"description": "渲染公式失敗,請檢查公式格式是否正確"
+ },
+ "http": {
+ "400": "請求錯誤,請檢查請求參數是否正確。如果修改了模型設置,請重置到預設設置",
+ "401": "身份驗證失敗,請檢查 API 密鑰是否正確",
+ "403": "禁止訪問,請檢查是否實名認證,或聯繫服務商詢問被禁止原因",
+ "404": "模型不存在或者請求路徑錯誤",
+ "429": "請求過多,請稍後再試",
+ "500": "伺服器錯誤,請稍後再試",
+ "502": "網關錯誤,請稍後再試",
+ "503": "服務不可用,請稍後再試",
+ "504": "網關超時,請稍後再試"
}
},
"export": {
diff --git a/src/renderer/src/pages/home/Messages/MessageError.tsx b/src/renderer/src/pages/home/Messages/MessageError.tsx
index d86c6352..0a7085f8 100644
--- a/src/renderer/src/pages/home/Messages/MessageError.tsx
+++ b/src/renderer/src/pages/home/Messages/MessageError.tsx
@@ -1,21 +1,35 @@
import { Message } from '@renderer/types'
-import { Alert } from 'antd'
-import { t } from 'i18next'
+import { Alert as AntdAlert } from 'antd'
import { FC } from 'react'
+import { useTranslation } from 'react-i18next'
+import styled from 'styled-components'
import Markdown from '../Markdown/Markdown'
-
const MessageError: FC<{ message: Message }> = ({ message }) => {
return (
<>
-
+
>
)
}
+const MessageErrorInfo: FC<{ message: Message }> = ({ message }) => {
+ const { t } = useTranslation()
+
+ const HTTP_ERROR_CODES = [400, 401, 403, 404, 429, 500, 502, 503, 504]
+
+ if (message.error && HTTP_ERROR_CODES.includes(message.error?.status)) {
+ return
+ }
+
+ return
+}
+
+const Alert = styled(AntdAlert)`
+ margin-bottom: 15px;
+ padding: 10px;
+ font-size: 12px;
+`
+
export default MessageError
diff --git a/src/renderer/src/services/ApiService.ts b/src/renderer/src/services/ApiService.ts
index c8648c99..ee6e034b 100644
--- a/src/renderer/src/services/ApiService.ts
+++ b/src/renderer/src/services/ApiService.ts
@@ -2,7 +2,7 @@ import i18n from '@renderer/i18n'
import store from '@renderer/store'
import { setGenerating } from '@renderer/store/runtime'
import { Assistant, Message, Model, Provider, Suggestion } from '@renderer/types'
-import { formatErrorMessage } from '@renderer/utils/error'
+import { formatErrorMessage, formatMessageError } from '@renderer/utils/error'
import { isEmpty } from 'lodash'
import AiProvider from '../providers/AiProvider'
@@ -85,6 +85,7 @@ export async function fetchChatCompletion({
} catch (error: any) {
message.status = 'error'
message.content = formatErrorMessage(error)
+ message.error = formatMessageError(error)
}
timer && clearInterval(timer)
diff --git a/src/renderer/src/types/index.ts b/src/renderer/src/types/index.ts
index ba4bb7fb..20ab03c8 100644
--- a/src/renderer/src/types/index.ts
+++ b/src/renderer/src/types/index.ts
@@ -70,6 +70,7 @@ export type Message = {
}
askId?: string
useful?: boolean
+ error?: Record
}
export type Metrics = {
diff --git a/src/renderer/src/utils/error.ts b/src/renderer/src/utils/error.ts
index eb8add66..77d5da4e 100644
--- a/src/renderer/src/utils/error.ts
+++ b/src/renderer/src/utils/error.ts
@@ -43,6 +43,22 @@ export function formatErrorMessage(error: any): string {
}
}
+export function formatMessageError(error: any): Record {
+ try {
+ const detailedError = getErrorDetails(error)
+ delete detailedError?.headers
+ delete detailedError?.stack
+ delete detailedError?.request_id
+ return detailedError
+ } catch (e) {
+ try {
+ return { message: String(error) }
+ } catch {
+ return { message: 'Error: Unable to format error message' }
+ }
+ }
+}
+
export function getErrorMessage(error: any): string {
return error?.message || error?.toString() || ''
}