diff --git a/web/src/app/home/knowledge/KBDetailDialog.tsx b/web/src/app/home/knowledge/KBDetailDialog.tsx index de97ad21..32278d4c 100644 --- a/web/src/app/home/knowledge/KBDetailDialog.tsx +++ b/web/src/app/home/knowledge/KBDetailDialog.tsx @@ -22,6 +22,7 @@ import { Button } from '@/components/ui/button'; import { useTranslation } from 'react-i18next'; import { httpClient } from '@/app/infra/http/HttpClient'; import { KnowledgeBase } from '@/app/infra/entities/api'; +import { CustomApiError } from '@/app/infra/entities/common'; import { toast } from 'sonner'; import KBForm from '@/app/home/knowledge/components/kb-form/KBForm'; import KBDoc from '@/app/home/knowledge/components/kb-docs/KBDoc'; @@ -68,7 +69,7 @@ export default function KBDetailDialog({ setKbInfo(resp.base); } catch (e) { console.error('Failed to load KB info:', e); - toast.error(t('knowledge.loadKnowledgeBaseFailed')); + toast.error(t('knowledge.loadKnowledgeBaseFailed') + (e as CustomApiError).msg); } } @@ -136,7 +137,7 @@ export default function KBDetailDialog({ onKbDeleted(); } catch (e) { console.error('Failed to delete KB:', e); - toast.error(t('knowledge.deleteKnowledgeBaseFailed')); + toast.error(t('knowledge.deleteKnowledgeBaseFailed') + (e as CustomApiError).msg); } finally { setShowDeleteConfirm(false); } diff --git a/web/src/app/home/knowledge/components/kb-docs/FileUploadZone.tsx b/web/src/app/home/knowledge/components/kb-docs/FileUploadZone.tsx index 4dbbff17..99d09014 100644 --- a/web/src/app/home/knowledge/components/kb-docs/FileUploadZone.tsx +++ b/web/src/app/home/knowledge/components/kb-docs/FileUploadZone.tsx @@ -12,7 +12,7 @@ import { httpClient } from '@/app/infra/http/HttpClient'; import { toast } from 'sonner'; import { useTranslation } from 'react-i18next'; import { ParserInfo } from '@/app/infra/entities/api'; -import { I18nObject } from '@/app/infra/entities/common'; +import { CustomApiError, I18nObject } from '@/app/infra/entities/common'; import { extractI18nObject } from '@/i18n/I18nProvider'; interface FileUploadZoneProps { @@ -97,7 +97,7 @@ export default function FileUploadZone({ onUploadSuccess(); } catch (error) { console.error('File upload failed:', error); - const errorMessage = t('knowledge.documentsTab.uploadError'); + const errorMessage = t('knowledge.documentsTab.uploadError') + (error as CustomApiError).msg; toast.error(errorMessage, { id: toastId }); onUploadError(errorMessage); } finally { diff --git a/web/src/app/home/knowledge/components/kb-docs/KBDoc.tsx b/web/src/app/home/knowledge/components/kb-docs/KBDoc.tsx index a3e7a338..bdac2fc3 100644 --- a/web/src/app/home/knowledge/components/kb-docs/KBDoc.tsx +++ b/web/src/app/home/knowledge/components/kb-docs/KBDoc.tsx @@ -1,7 +1,7 @@ import { useCallback, useEffect, useRef, useState } from 'react'; import { httpClient } from '@/app/infra/http/HttpClient'; import { KnowledgeBaseFile } from '@/app/infra/entities/api'; -import { I18nObject } from '@/app/infra/entities/common'; +import { I18nObject, CustomApiError } from '@/app/infra/entities/common'; import { columns, DocumentFile } from './documents/columns'; import { DataTable } from './documents/data-table'; import FileUploadZone from './FileUploadZone'; @@ -87,7 +87,7 @@ export default function KBDoc({ }) .catch((error) => { console.error('Delete failed:', error); - toast.error(t('knowledge.documentsTab.fileDeleteFailed')); + toast.error(t('knowledge.documentsTab.fileDeleteFailed') + (error as CustomApiError).msg); }); }; diff --git a/web/src/app/home/knowledge/components/kb-form/KBForm.tsx b/web/src/app/home/knowledge/components/kb-form/KBForm.tsx index 3f114dd3..95701d6b 100644 --- a/web/src/app/home/knowledge/components/kb-form/KBForm.tsx +++ b/web/src/app/home/knowledge/components/kb-form/KBForm.tsx @@ -23,6 +23,7 @@ import { SelectValue, } from '@/components/ui/select'; import { KnowledgeBase, KnowledgeEngine } from '@/app/infra/entities/api'; +import { CustomApiError } from '@/app/infra/entities/common'; import { toast } from 'sonner'; import { extractI18nObject } from '@/i18n/I18nProvider'; import DynamicFormComponent from '@/app/home/components/dynamic-form/DynamicFormComponent'; @@ -217,7 +218,7 @@ export default function KBForm({ }) .catch((err) => { console.error('update knowledge base failed', err); - toast.error(t('knowledge.updateKnowledgeBaseFailed')); + toast.error(t('knowledge.updateKnowledgeBaseFailed') + (err as CustomApiError).msg); }); } else { // Create knowledge base @@ -228,7 +229,7 @@ export default function KBForm({ }) .catch((err) => { console.error('create knowledge base failed', err); - toast.error(t('knowledge.createKnowledgeBaseFailed')); + toast.error(t('knowledge.createKnowledgeBaseFailed') + (err as CustomApiError).msg); }); } }; diff --git a/web/src/app/home/knowledge/components/kb-retrieve/KBRetrieveGeneric.tsx b/web/src/app/home/knowledge/components/kb-retrieve/KBRetrieveGeneric.tsx index 975596b0..becdb0fe 100644 --- a/web/src/app/home/knowledge/components/kb-retrieve/KBRetrieveGeneric.tsx +++ b/web/src/app/home/knowledge/components/kb-retrieve/KBRetrieveGeneric.tsx @@ -6,6 +6,7 @@ import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { useTranslation } from 'react-i18next'; import { RetrieveResult } from '@/app/infra/entities/api'; +import { CustomApiError } from '@/app/infra/entities/common'; import { toast } from 'sonner'; interface KBRetrieveGenericProps { @@ -41,7 +42,7 @@ export default function KBRetrieveGeneric({ setResults(response.results); } catch (error) { console.error('Retrieve failed:', error); - toast.error(t('knowledge.retrieveError')); + toast.error(t('knowledge.retrieveError') + (error as CustomApiError).msg); } finally { setLoading(false); } diff --git a/web/src/i18n/locales/en-US.ts b/web/src/i18n/locales/en-US.ts index d9fb1fdd..77453182 100644 --- a/web/src/i18n/locales/en-US.ts +++ b/web/src/i18n/locales/en-US.ts @@ -707,7 +707,7 @@ const enUS = { cannotChangeEmbeddingModel: 'Knowledge base created cannot be modified embedding model', updateKnowledgeBaseSuccess: 'Knowledge base updated successfully', - updateKnowledgeBaseFailed: 'Knowledge base update failed', + updateKnowledgeBaseFailed: 'Knowledge base update failed: ', documentsTab: { name: 'Name', status: 'Status', @@ -717,14 +717,14 @@ const enUS = { supportedFormats: 'Supports PDF, Word, TXT, Markdown, HTML, ZIP and other document formats', uploadSuccess: 'File uploaded successfully!', - uploadError: 'File upload failed, please try again', + uploadError: 'File upload failed: ', uploadingFile: 'Uploading file...', fileSizeExceeded: 'File size exceeds 10MB limit. Please split into smaller files.', actions: 'Actions', delete: 'Delete File', fileDeleteSuccess: 'File deleted successfully', - fileDeleteFailed: 'File deletion failed', + fileDeleteFailed: 'File deletion failed: ', processing: 'Processing', completed: 'Completed', failed: 'Failed', @@ -745,7 +745,7 @@ const enUS = { content: 'Content', fileName: 'File Name', noResults: 'No results', - retrieveError: 'Retrieve failed', + retrieveError: 'Retrieve failed: ', unknownEngine: 'Unknown Engine', knowledgeEngine: 'Knowledge Engine', knowledgeEngineRequired: 'Knowledge engine is required', @@ -758,9 +758,9 @@ const enUS = { retrievalSettings: 'Retrieval Settings', noEnginesAvailable: 'No knowledge base engines available', installEngineHint: 'Please install a knowledge base plugin first', - createKnowledgeBaseFailed: 'Failed to create knowledge base', - loadKnowledgeBaseFailed: 'Failed to load knowledge base', - deleteKnowledgeBaseFailed: 'Failed to delete knowledge base', + createKnowledgeBaseFailed: 'Failed to create knowledge base: ', + loadKnowledgeBaseFailed: 'Failed to load knowledge base: ', + deleteKnowledgeBaseFailed: 'Failed to delete knowledge base: ', getKnowledgeBaseListError: 'Failed to get knowledge base list: ', embeddingModel: 'Embedding Model', embeddingModelRequired: 'Embedding model is required for this engine', diff --git a/web/src/i18n/locales/ja-JP.ts b/web/src/i18n/locales/ja-JP.ts index f9f5929c..57928774 100644 --- a/web/src/i18n/locales/ja-JP.ts +++ b/web/src/i18n/locales/ja-JP.ts @@ -709,7 +709,7 @@ const jaJP = { cannotChangeEmbeddingModel: '知識ベース作成後は埋め込みモデルを変更できません', updateKnowledgeBaseSuccess: '知識ベースの更新に成功しました', - updateKnowledgeBaseFailed: '知識ベースの更新に失敗しました', + updateKnowledgeBaseFailed: '知識ベースの更新に失敗しました:', documentsTab: { name: '名前', status: 'ステータス', @@ -720,14 +720,14 @@ const jaJP = { supportedFormats: 'PDF、Word、TXT、Markdownなどのドキュメントファイルをサポートしています', uploadSuccess: 'ファイルのアップロードに成功しました!', - uploadError: 'ファイルのアップロードに失敗しました。再度お試しください', + uploadError: 'ファイルのアップロードに失敗しました:', uploadingFile: 'ファイルをアップロード中...', fileSizeExceeded: 'ファイルサイズが10MBの制限を超えています。より小さいファイルに分割してください。', actions: 'アクション', delete: 'ドキュメントを削除', fileDeleteSuccess: 'ドキュメントの削除に成功しました', - fileDeleteFailed: 'ドキュメントの削除に失敗しました', + fileDeleteFailed: 'ドキュメントの削除に失敗しました:', processing: '処理中', completed: '完了', failed: '失敗', @@ -748,10 +748,10 @@ const jaJP = { content: '内容', fileName: 'ファイル名', noResults: '検索結果がありません', - retrieveError: '検索に失敗しました', + retrieveError: '検索に失敗しました:', unknownEngine: '不明なエンジン', - loadKnowledgeBaseFailed: 'ナレッジベースの読み込みに失敗しました', - deleteKnowledgeBaseFailed: 'ナレッジベースの削除に失敗しました', + loadKnowledgeBaseFailed: 'ナレッジベースの読み込みに失敗しました:', + deleteKnowledgeBaseFailed: 'ナレッジベースの削除に失敗しました:', getKnowledgeBaseListError: 'ナレッジベース一覧の取得に失敗しました:', addExternal: '外部ナレッジベースを追加', createExternalSuccess: '外部ナレッジベースが正常に作成されました', diff --git a/web/src/i18n/locales/zh-Hans.ts b/web/src/i18n/locales/zh-Hans.ts index 738da0e4..5b0d3609 100644 --- a/web/src/i18n/locales/zh-Hans.ts +++ b/web/src/i18n/locales/zh-Hans.ts @@ -679,7 +679,7 @@ const zhHans = { updateTime: '更新于', cannotChangeEmbeddingModel: '知识库创建后不可修改嵌入模型', updateKnowledgeBaseSuccess: '知识库更新成功', - updateKnowledgeBaseFailed: '知识库更新失败', + updateKnowledgeBaseFailed: '知识库更新失败:', documentsTab: { name: '名称', status: '状态', @@ -688,13 +688,13 @@ const zhHans = { uploading: '上传中...', supportedFormats: '支持 PDF、Word、TXT、Markdown、HTML、ZIP 等文档格式', uploadSuccess: '文件上传成功!', - uploadError: '文件上传失败,请重试', + uploadError: '文件上传失败:', uploadingFile: '上传文件中...', fileSizeExceeded: '文件大小超过 10MB 限制,请分割成较小的文件后上传', actions: '操作', delete: '删除文件', fileDeleteSuccess: '文件删除成功', - fileDeleteFailed: '文件删除失败', + fileDeleteFailed: '文件删除失败:', processing: '处理中', completed: '完成', failed: '失败', @@ -715,7 +715,7 @@ const zhHans = { content: '内容', fileName: '文件名', noResults: '暂无结果', - retrieveError: '检索失败', + retrieveError: '检索失败:', unknownEngine: '未知引擎', knowledgeEngine: '知识引擎', knowledgeEngineRequired: '知识引擎不能为空', @@ -727,9 +727,9 @@ const zhHans = { retrievalSettings: '检索设置', noEnginesAvailable: '没有可用的知识库引擎', installEngineHint: '请先安装知识库插件', - createKnowledgeBaseFailed: '知识库创建失败', - loadKnowledgeBaseFailed: '知识库加载失败', - deleteKnowledgeBaseFailed: '知识库删除失败', + createKnowledgeBaseFailed: '知识库创建失败:', + loadKnowledgeBaseFailed: '知识库加载失败:', + deleteKnowledgeBaseFailed: '知识库删除失败:', getKnowledgeBaseListError: '获取知识库列表失败:', embeddingModel: '嵌入模型', embeddingModelRequired: '此引擎需要选择嵌入模型', diff --git a/web/src/i18n/locales/zh-Hant.ts b/web/src/i18n/locales/zh-Hant.ts index 92079b84..683bc5f5 100644 --- a/web/src/i18n/locales/zh-Hant.ts +++ b/web/src/i18n/locales/zh-Hant.ts @@ -672,7 +672,7 @@ const zhHant = { updateTime: '更新於', cannotChangeEmbeddingModel: '知識庫建立後不可修改嵌入模型', updateKnowledgeBaseSuccess: '知識庫更新成功', - updateKnowledgeBaseFailed: '知識庫更新失敗', + updateKnowledgeBaseFailed: '知識庫更新失敗:', documentsTab: { name: '名稱', status: '狀態', @@ -681,13 +681,13 @@ const zhHant = { uploading: '上傳中...', supportedFormats: '支援 PDF、Word、TXT、Markdown 等文檔格式', uploadSuccess: '文檔上傳成功!', - uploadError: '文檔上傳失敗,請重試', + uploadError: '文檔上傳失敗:', uploadingFile: '上傳文檔中...', fileSizeExceeded: '檔案大小超過 10MB 限制,請分割成較小的檔案後上傳', actions: '操作', delete: '刪除文檔', fileDeleteSuccess: '文檔刪除成功', - fileDeleteFailed: '文檔刪除失敗', + fileDeleteFailed: '文檔刪除失敗:', processing: '處理中', completed: '完成', failed: '失敗', @@ -708,10 +708,10 @@ const zhHant = { content: '內容', fileName: '文檔名稱', noResults: '暫無結果', - retrieveError: '檢索失敗', + retrieveError: '檢索失敗:', unknownEngine: '未知引擎', - loadKnowledgeBaseFailed: '知識庫載入失敗', - deleteKnowledgeBaseFailed: '知識庫刪除失敗', + loadKnowledgeBaseFailed: '知識庫載入失敗:', + deleteKnowledgeBaseFailed: '知識庫刪除失敗:', getKnowledgeBaseListError: '取得知識庫列表失敗:', addExternal: '添加外部知識庫', createExternalSuccess: '外部知識庫創建成功',