@lobehub/chat 1.11.2 → 1.11.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +25 -0
- package/docs/self-hosting/server-database/vercel.mdx +78 -75
- package/docs/self-hosting/start.zh-CN.mdx +2 -2
- package/docs/usage/providers/siliconcloud.mdx +4 -3
- package/docs/usage/providers/siliconcloud.zh-CN.mdx +0 -1
- package/locales/ar/components.json +60 -0
- package/locales/bg-BG/components.json +60 -0
- package/locales/de-DE/components.json +60 -0
- package/locales/en-US/components.json +60 -0
- package/locales/es-ES/components.json +60 -0
- package/locales/fr-FR/components.json +60 -0
- package/locales/it-IT/components.json +60 -0
- package/locales/ja-JP/components.json +60 -0
- package/locales/ko-KR/components.json +60 -0
- package/locales/nl-NL/components.json +60 -0
- package/locales/pl-PL/components.json +60 -0
- package/locales/pt-BR/components.json +60 -0
- package/locales/ru-RU/components.json +60 -0
- package/locales/tr-TR/components.json +60 -0
- package/locales/vi-VN/components.json +60 -0
- package/locales/zh-CN/components.json +60 -0
- package/locales/zh-TW/components.json +60 -0
- package/package.json +1 -1
- package/src/app/(main)/settings/_layout/Desktop/SideBar.tsx +3 -22
- package/src/components/FileIcon/config.ts +12 -0
- package/src/components/FileIcon/index.tsx +30 -0
- package/src/components/FunctionModal/createModalHooks.ts +46 -0
- package/src/components/FunctionModal/index.ts +1 -0
- package/src/components/FunctionModal/style.tsx +39 -0
- package/src/components/GoBack/index.tsx +46 -0
- package/src/components/PanelTitle/index.tsx +41 -0
- package/src/components/RepoIcon/index.tsx +22 -0
- package/src/components/SidebarHeader/index.tsx +4 -2
- package/src/components/TipGuide/index.tsx +150 -0
- package/src/database/client/models/message.ts +5 -0
- package/src/features/Conversation/Messages/Default.tsx +1 -2
- package/src/libs/agent-runtime/AgentRuntime.ts +9 -2
- package/src/libs/agent-runtime/BaseAI.ts +14 -1
- package/src/libs/agent-runtime/qwen/index.ts +3 -4
- package/src/libs/agent-runtime/types/embeddings.ts +43 -0
- package/src/libs/agent-runtime/types/index.ts +1 -0
- package/src/libs/agent-runtime/utils/openaiCompatibleFactory/index.ts +25 -2
- package/src/libs/langchain/file.ts +29 -0
- package/src/libs/langchain/index.ts +1 -0
- package/src/libs/langchain/loaders/code/__tests__/index.test.ts +34 -0
- package/src/libs/langchain/loaders/code/__tests__/long.json +250 -0
- package/src/libs/langchain/loaders/code/__tests__/long.txt +885 -0
- package/src/libs/langchain/loaders/code/index.ts +15 -0
- package/src/libs/langchain/loaders/config.ts +6 -0
- package/src/libs/langchain/loaders/docx/index.ts +13 -0
- package/src/libs/langchain/loaders/index.ts +98 -0
- package/src/libs/langchain/loaders/markdown/__tests__/demo.mdx +325 -0
- package/src/libs/langchain/loaders/markdown/__tests__/index.test.ts +13 -0
- package/src/libs/langchain/loaders/markdown/index.ts +9 -0
- package/src/libs/langchain/loaders/pdf/index.ts +7 -0
- package/src/libs/langchain/loaders/pptx/index.ts +7 -0
- package/src/libs/langchain/loaders/txt/__tests__/index.test.ts +54 -0
- package/src/libs/langchain/loaders/txt/__tests__/long.json +38 -0
- package/src/libs/langchain/loaders/txt/__tests__/pg24022.txt +83 -0
- package/src/libs/langchain/loaders/txt/index.ts +9 -0
- package/src/libs/langchain/types.ts +1 -0
- package/src/libs/unstructured/__tests__/fixtures/image-parse/fast-partition-none-output.json +3258 -0
- package/src/libs/unstructured/__tests__/fixtures/image-parse/fast-partition-none-raw.json +3255 -0
- package/src/libs/unstructured/__tests__/fixtures/table-parse/auto-partition-basic-output.json +347 -0
- package/src/libs/unstructured/__tests__/fixtures/table-parse/auto-partition-basic-raw.json +131 -0
- package/src/libs/unstructured/__tests__/fixtures/table-parse/auto-partition-raw.json +276 -0
- package/src/libs/unstructured/__tests__/fixtures/table-parse/fast-partition-basic-output.json +1865 -0
- package/src/libs/unstructured/__tests__/fixtures/table-parse/fast-partition-basic-raw.json +111 -0
- package/src/libs/unstructured/__tests__/fixtures/table-parse/fast-partition-raw.json +1892 -0
- package/src/libs/unstructured/__tests__/index.test.ts +165 -0
- package/src/libs/unstructured/index.ts +166 -0
- package/src/locales/default/components.ts +62 -0
- package/src/utils/colorUtils.ts +19 -0
- package/src/utils/sleep.ts +4 -0
|
@@ -5,6 +5,66 @@
|
|
|
5
5
|
"dragFileTitle": "Загрузить файл",
|
|
6
6
|
"dragTitle": "Загрузить изображение"
|
|
7
7
|
},
|
|
8
|
+
"FileManager": {
|
|
9
|
+
"actions": {
|
|
10
|
+
"addToKnowledgeBase": "Добавить в базу знаний",
|
|
11
|
+
"addToOtherKnowledgeBase": "Добавить в другую базу знаний",
|
|
12
|
+
"batchChunking": "Пакетная разбивка",
|
|
13
|
+
"chunking": "Разбивка",
|
|
14
|
+
"chunkingTooltip": "Разделите файл на несколько текстовых блоков и векторизуйте их для семантического поиска и диалога с файлом",
|
|
15
|
+
"confirmDelete": "Вы собираетесь удалить этот файл. После удаления его нельзя будет восстановить. Пожалуйста, подтвердите ваше действие.",
|
|
16
|
+
"confirmDeleteMultiFiles": "Вы собираетесь удалить выбранные {{count}} файлов. После удаления их нельзя будет восстановить. Пожалуйста, подтвердите ваше действие.",
|
|
17
|
+
"confirmRemoveFromKnowledgeBase": "Вы собираетесь удалить выбранные {{count}} файлов из базы знаний. После удаления файлы все еще будут доступны во всех файлах. Пожалуйста, подтвердите ваше действие.",
|
|
18
|
+
"copyUrl": "Скопировать ссылку",
|
|
19
|
+
"copyUrlSuccess": "Адрес файла успешно скопирован",
|
|
20
|
+
"createChunkingTask": "Подготовка...",
|
|
21
|
+
"deleteSuccess": "Файл успешно удален",
|
|
22
|
+
"downloading": "Загрузка файла...",
|
|
23
|
+
"removeFromKnowledgeBase": "Удалить из базы знаний",
|
|
24
|
+
"removeFromKnowledgeBaseSuccess": "Файл успешно удален"
|
|
25
|
+
},
|
|
26
|
+
"bottom": "Вы достигли конца",
|
|
27
|
+
"config": {
|
|
28
|
+
"showFilesInKnowledgeBase": "Показать содержимое в базе знаний"
|
|
29
|
+
},
|
|
30
|
+
"emptyStatus": {
|
|
31
|
+
"actions": {
|
|
32
|
+
"file": "Загрузить файл",
|
|
33
|
+
"folder": "Загрузить папку",
|
|
34
|
+
"knowledgeBase": "Создать новую базу знаний"
|
|
35
|
+
},
|
|
36
|
+
"or": "или",
|
|
37
|
+
"title": "Перетащите файл или папку сюда"
|
|
38
|
+
},
|
|
39
|
+
"title": {
|
|
40
|
+
"createdAt": "Дата создания",
|
|
41
|
+
"size": "Размер",
|
|
42
|
+
"title": "Файл"
|
|
43
|
+
},
|
|
44
|
+
"total": {
|
|
45
|
+
"fileCount": "Всего {{count}} элементов",
|
|
46
|
+
"selectedCount": "Выбрано {{count}} элементов"
|
|
47
|
+
}
|
|
48
|
+
},
|
|
49
|
+
"FileParsingStatus": {
|
|
50
|
+
"chunks": {
|
|
51
|
+
"embeddingStatus": {
|
|
52
|
+
"empty": "Текстовые блоки еще не полностью векторизованы, что приведет к недоступности функции семантического поиска. Для повышения качества поиска, пожалуйста, векторизуйте текстовые блоки.",
|
|
53
|
+
"processing": "Текстовые блоки векторизуются, пожалуйста, подождите.",
|
|
54
|
+
"success": "Все текущие текстовые блоки успешно векторизованы."
|
|
55
|
+
},
|
|
56
|
+
"embeddings": "Векторизация",
|
|
57
|
+
"status": {
|
|
58
|
+
"error": "Ошибка разбивки",
|
|
59
|
+
"errorResult": "Ошибка разбивки, пожалуйста, проверьте и повторите попытку. Причина ошибки:",
|
|
60
|
+
"processing": "В процессе разбивки",
|
|
61
|
+
"processingTip": "Сервер разбивает текстовые блоки, закрытие страницы не повлияет на процесс разбивки."
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
},
|
|
65
|
+
"GoBack": {
|
|
66
|
+
"back": "Назад"
|
|
67
|
+
},
|
|
8
68
|
"ModelSelect": {
|
|
9
69
|
"featureTag": {
|
|
10
70
|
"custom": "Пользовательская модель по умолчанию поддерживает как вызов функций, так и распознавание изображений. Пожалуйста, проверьте доступность указанных возможностей в вашем случае",
|
|
@@ -5,6 +5,66 @@
|
|
|
5
5
|
"dragFileTitle": "Dosya Yükle",
|
|
6
6
|
"dragTitle": "Resim Yükle"
|
|
7
7
|
},
|
|
8
|
+
"FileManager": {
|
|
9
|
+
"actions": {
|
|
10
|
+
"addToKnowledgeBase": "Bilgi tabanına ekle",
|
|
11
|
+
"addToOtherKnowledgeBase": "Diğer bilgi tabanına ekle",
|
|
12
|
+
"batchChunking": "Toplu parçalara ayırma",
|
|
13
|
+
"chunking": "Parçalara ayırma",
|
|
14
|
+
"chunkingTooltip": "Dosyayı birden fazla metin parçasına ayırıp vektörleştirdikten sonra, anlamsal arama ve dosya diyalogları için kullanılabilir",
|
|
15
|
+
"confirmDelete": "Bu dosya silinecek, silindikten sonra geri alınamaz, lütfen işleminizi onaylayın",
|
|
16
|
+
"confirmDeleteMultiFiles": "Seçilen {{count}} dosya silinecek, silindikten sonra geri alınamaz, lütfen işleminizi onaylayın",
|
|
17
|
+
"confirmRemoveFromKnowledgeBase": "Seçilen {{count}} dosya bilgi tabanından kaldırılacak, kaldırıldıktan sonra dosyalar tüm dosyalar arasında görüntülenebilir, lütfen işleminizi onaylayın",
|
|
18
|
+
"copyUrl": "Bağlantıyı kopyala",
|
|
19
|
+
"copyUrlSuccess": "Dosya adresi başarıyla kopyalandı",
|
|
20
|
+
"createChunkingTask": "Hazırlanıyor...",
|
|
21
|
+
"deleteSuccess": "Dosya başarıyla silindi",
|
|
22
|
+
"downloading": "Dosya indiriliyor...",
|
|
23
|
+
"removeFromKnowledgeBase": "Bilgi tabanından kaldır",
|
|
24
|
+
"removeFromKnowledgeBaseSuccess": "Dosya başarıyla kaldırıldı"
|
|
25
|
+
},
|
|
26
|
+
"bottom": "Artık sona geldik",
|
|
27
|
+
"config": {
|
|
28
|
+
"showFilesInKnowledgeBase": "Bilgi tabanındaki içeriği göster"
|
|
29
|
+
},
|
|
30
|
+
"emptyStatus": {
|
|
31
|
+
"actions": {
|
|
32
|
+
"file": "Dosya yükle",
|
|
33
|
+
"folder": "Klasör yükle",
|
|
34
|
+
"knowledgeBase": "Yeni bilgi tabanı oluştur"
|
|
35
|
+
},
|
|
36
|
+
"or": "veya",
|
|
37
|
+
"title": "Dosyayı veya klasörü buraya sürükleyin"
|
|
38
|
+
},
|
|
39
|
+
"title": {
|
|
40
|
+
"createdAt": "Oluşturulma zamanı",
|
|
41
|
+
"size": "Boyut",
|
|
42
|
+
"title": "Dosya"
|
|
43
|
+
},
|
|
44
|
+
"total": {
|
|
45
|
+
"fileCount": "Toplam {{count}} öğe",
|
|
46
|
+
"selectedCount": "Seçilen {{count}} öğe"
|
|
47
|
+
}
|
|
48
|
+
},
|
|
49
|
+
"FileParsingStatus": {
|
|
50
|
+
"chunks": {
|
|
51
|
+
"embeddingStatus": {
|
|
52
|
+
"empty": "Metin parçaları henüz tamamen vektörleştirilmedi, bu durum anlamsal arama işlevinin kullanılamamasına neden olabilir, arama kalitesini artırmak için lütfen metin parçalarını vektörleştirin",
|
|
53
|
+
"processing": "Metin parçaları vektörleştiriliyor, lütfen bekleyin",
|
|
54
|
+
"success": "Mevcut metin parçaları tamamen vektörleştirildi"
|
|
55
|
+
},
|
|
56
|
+
"embeddings": "Vektörleştirme",
|
|
57
|
+
"status": {
|
|
58
|
+
"error": "Parçalara ayırma başarısız oldu",
|
|
59
|
+
"errorResult": "Parçalara ayırma başarısız oldu, lütfen kontrol edip tekrar deneyin. Başarısız olma nedeni:",
|
|
60
|
+
"processing": "Parçalara ayırma işlemi devam ediyor",
|
|
61
|
+
"processingTip": "Sunucu metin parçalarını ayırıyor, sayfayı kapatmak parçalama ilerlemesini etkilemez"
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
},
|
|
65
|
+
"GoBack": {
|
|
66
|
+
"back": "Geri dön"
|
|
67
|
+
},
|
|
8
68
|
"ModelSelect": {
|
|
9
69
|
"featureTag": {
|
|
10
70
|
"custom": "Özel model, varsayılan olarak hem fonksiyon çağrısını hem de görüntü tanımayı destekler, yukarıdaki yeteneklerin kullanılabilirliğini doğrulamak için lütfen gerçek durumu kontrol edin",
|
|
@@ -5,6 +5,66 @@
|
|
|
5
5
|
"dragFileTitle": "Tải lên tệp",
|
|
6
6
|
"dragTitle": "Tải lên hình ảnh"
|
|
7
7
|
},
|
|
8
|
+
"FileManager": {
|
|
9
|
+
"actions": {
|
|
10
|
+
"addToKnowledgeBase": "Thêm vào kho tri thức",
|
|
11
|
+
"addToOtherKnowledgeBase": "Thêm vào kho tri thức khác",
|
|
12
|
+
"batchChunking": "Chia nhỏ theo lô",
|
|
13
|
+
"chunking": "Chia nhỏ",
|
|
14
|
+
"chunkingTooltip": "Chia tách tệp thành nhiều khối văn bản và vector hóa, có thể sử dụng cho tìm kiếm ngữ nghĩa và đối thoại tệp",
|
|
15
|
+
"confirmDelete": "Bạn sắp xóa tệp này, sau khi xóa sẽ không thể khôi phục, vui lòng xác nhận hành động của bạn",
|
|
16
|
+
"confirmDeleteMultiFiles": "Bạn sắp xóa {{count}} tệp đã chọn, sau khi xóa sẽ không thể khôi phục, vui lòng xác nhận hành động của bạn",
|
|
17
|
+
"confirmRemoveFromKnowledgeBase": "Bạn sắp xóa {{count}} tệp đã chọn khỏi kho tri thức, sau khi xóa tệp vẫn có thể xem trong tất cả các tệp, vui lòng xác nhận hành động của bạn",
|
|
18
|
+
"copyUrl": "Sao chép liên kết",
|
|
19
|
+
"copyUrlSuccess": "Địa chỉ tệp đã được sao chép thành công",
|
|
20
|
+
"createChunkingTask": "Đang chuẩn bị...",
|
|
21
|
+
"deleteSuccess": "Tệp đã được xóa thành công",
|
|
22
|
+
"downloading": "Đang tải tệp...",
|
|
23
|
+
"removeFromKnowledgeBase": "Xóa khỏi kho tri thức",
|
|
24
|
+
"removeFromKnowledgeBaseSuccess": "Tệp đã được xóa thành công"
|
|
25
|
+
},
|
|
26
|
+
"bottom": "Đã đến cuối rồi",
|
|
27
|
+
"config": {
|
|
28
|
+
"showFilesInKnowledgeBase": "Hiển thị nội dung trong kho tri thức"
|
|
29
|
+
},
|
|
30
|
+
"emptyStatus": {
|
|
31
|
+
"actions": {
|
|
32
|
+
"file": "Tải lên tệp",
|
|
33
|
+
"folder": "Tải lên thư mục",
|
|
34
|
+
"knowledgeBase": "Tạo kho tri thức mới"
|
|
35
|
+
},
|
|
36
|
+
"or": "hoặc",
|
|
37
|
+
"title": "Kéo tệp hoặc thư mục vào đây"
|
|
38
|
+
},
|
|
39
|
+
"title": {
|
|
40
|
+
"createdAt": "Thời gian tạo",
|
|
41
|
+
"size": "Kích thước",
|
|
42
|
+
"title": "Tệp"
|
|
43
|
+
},
|
|
44
|
+
"total": {
|
|
45
|
+
"fileCount": "Tổng cộng {{count}} mục",
|
|
46
|
+
"selectedCount": "Đã chọn {{count}} mục"
|
|
47
|
+
}
|
|
48
|
+
},
|
|
49
|
+
"FileParsingStatus": {
|
|
50
|
+
"chunks": {
|
|
51
|
+
"embeddingStatus": {
|
|
52
|
+
"empty": "Các khối văn bản chưa được vector hóa hoàn toàn, sẽ dẫn đến chức năng tìm kiếm ngữ nghĩa không khả dụng, để nâng cao chất lượng tìm kiếm, vui lòng vector hóa các khối văn bản",
|
|
53
|
+
"processing": "Các khối văn bản đang được vector hóa, vui lòng chờ",
|
|
54
|
+
"success": "Hiện tại tất cả các khối văn bản đã được vector hóa"
|
|
55
|
+
},
|
|
56
|
+
"embeddings": "Vector hóa",
|
|
57
|
+
"status": {
|
|
58
|
+
"error": "Chia nhỏ thất bại",
|
|
59
|
+
"errorResult": "Chia nhỏ thất bại, vui lòng kiểm tra và thử lại. Nguyên nhân thất bại:",
|
|
60
|
+
"processing": "Đang chia nhỏ",
|
|
61
|
+
"processingTip": "Máy chủ đang chia tách các khối văn bản, đóng trang không ảnh hưởng đến tiến trình chia nhỏ"
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
},
|
|
65
|
+
"GoBack": {
|
|
66
|
+
"back": "Quay lại"
|
|
67
|
+
},
|
|
8
68
|
"ModelSelect": {
|
|
9
69
|
"featureTag": {
|
|
10
70
|
"custom": "Mô hình tùy chỉnh, mặc định hỗ trợ cả cuộc gọi hàm và nhận diện hình ảnh, vui lòng xác minh khả năng sử dụng của chúng theo tình hình cụ thể",
|
|
@@ -5,6 +5,66 @@
|
|
|
5
5
|
"dragFileTitle": "上传文件",
|
|
6
6
|
"dragTitle": "上传图片"
|
|
7
7
|
},
|
|
8
|
+
"FileManager": {
|
|
9
|
+
"actions": {
|
|
10
|
+
"addToKnowledgeBase": "添加到知识库",
|
|
11
|
+
"addToOtherKnowledgeBase": "添加到其他知识库",
|
|
12
|
+
"batchChunking": "批量分块",
|
|
13
|
+
"chunking": "分块",
|
|
14
|
+
"chunkingTooltip": "将文件拆分为多个文本块并向量化后,可用于语义检索和文件对话",
|
|
15
|
+
"confirmDelete": "即将删除该文件,删除后该将无法找回,请确认你的操作",
|
|
16
|
+
"confirmDeleteMultiFiles": "即将删除选中的 {{count}} 个文件,删除后该将无法找回,请确认你的操作",
|
|
17
|
+
"confirmRemoveFromKnowledgeBase": "即将从知识库中移除选中的 {{count}} 个文件,移除后文件仍然可以在全部文件中查看,请确认你的操作",
|
|
18
|
+
"copyUrl": "复制链接",
|
|
19
|
+
"copyUrlSuccess": "文件地址复制成功",
|
|
20
|
+
"createChunkingTask": "准备中...",
|
|
21
|
+
"deleteSuccess": "文件删除成功",
|
|
22
|
+
"downloading": "文件下载中...",
|
|
23
|
+
"removeFromKnowledgeBase": "从知识库中移除",
|
|
24
|
+
"removeFromKnowledgeBaseSuccess": "文件移除成功"
|
|
25
|
+
},
|
|
26
|
+
"bottom": "已经到底啦",
|
|
27
|
+
"config": {
|
|
28
|
+
"showFilesInKnowledgeBase": "显示知识库中内容"
|
|
29
|
+
},
|
|
30
|
+
"emptyStatus": {
|
|
31
|
+
"actions": {
|
|
32
|
+
"file": "上传文件",
|
|
33
|
+
"folder": "上传文件夹",
|
|
34
|
+
"knowledgeBase": "新建知识库"
|
|
35
|
+
},
|
|
36
|
+
"or": "或者",
|
|
37
|
+
"title": "将文件或文件夹拖到这里"
|
|
38
|
+
},
|
|
39
|
+
"title": {
|
|
40
|
+
"createdAt": "创建时间",
|
|
41
|
+
"size": "大小",
|
|
42
|
+
"title": "文件"
|
|
43
|
+
},
|
|
44
|
+
"total": {
|
|
45
|
+
"fileCount": "共 {{count}} 项",
|
|
46
|
+
"selectedCount": "已选 {{count}} 项"
|
|
47
|
+
}
|
|
48
|
+
},
|
|
49
|
+
"FileParsingStatus": {
|
|
50
|
+
"chunks": {
|
|
51
|
+
"embeddingStatus": {
|
|
52
|
+
"empty": "文本块尚未完全向量化,将导致语义检索功能不可用,为提升检索质量,请对文本块向量化",
|
|
53
|
+
"processing": "文本块正在向量化,请耐心等待",
|
|
54
|
+
"success": "当前文本块均已向量化"
|
|
55
|
+
},
|
|
56
|
+
"embeddings": "向量化",
|
|
57
|
+
"status": {
|
|
58
|
+
"error": "分块失败",
|
|
59
|
+
"errorResult": "分块失败,请检查后重试。失败原因:",
|
|
60
|
+
"processing": "分块中",
|
|
61
|
+
"processingTip": "服务端正在拆分文本块,关闭页面不影响分块进度"
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
},
|
|
65
|
+
"GoBack": {
|
|
66
|
+
"back": "返回"
|
|
67
|
+
},
|
|
8
68
|
"ModelSelect": {
|
|
9
69
|
"featureTag": {
|
|
10
70
|
"custom": "自定义模型,默认设定同时支持函数调用与视觉识别,请根据实际情况验证上述能力的可用性",
|
|
@@ -5,6 +5,66 @@
|
|
|
5
5
|
"dragFileTitle": "上傳檔案",
|
|
6
6
|
"dragTitle": "上傳圖片"
|
|
7
7
|
},
|
|
8
|
+
"FileManager": {
|
|
9
|
+
"actions": {
|
|
10
|
+
"addToKnowledgeBase": "添加到知識庫",
|
|
11
|
+
"addToOtherKnowledgeBase": "添加到其他知識庫",
|
|
12
|
+
"batchChunking": "批量分塊",
|
|
13
|
+
"chunking": "分塊",
|
|
14
|
+
"chunkingTooltip": "將文件拆分為多個文本塊並向量化後,可用於語義檢索和文件對話",
|
|
15
|
+
"confirmDelete": "即將刪除該文件,刪除後將無法找回,請確認你的操作",
|
|
16
|
+
"confirmDeleteMultiFiles": "即將刪除選中的 {{count}} 個文件,刪除後將無法找回,請確認你的操作",
|
|
17
|
+
"confirmRemoveFromKnowledgeBase": "即將從知識庫中移除選中的 {{count}} 個文件,移除後文件仍然可以在全部文件中查看,請確認你的操作",
|
|
18
|
+
"copyUrl": "複製鏈接",
|
|
19
|
+
"copyUrlSuccess": "文件地址複製成功",
|
|
20
|
+
"createChunkingTask": "準備中...",
|
|
21
|
+
"deleteSuccess": "文件刪除成功",
|
|
22
|
+
"downloading": "文件下載中...",
|
|
23
|
+
"removeFromKnowledgeBase": "從知識庫中移除",
|
|
24
|
+
"removeFromKnowledgeBaseSuccess": "文件移除成功"
|
|
25
|
+
},
|
|
26
|
+
"bottom": "已經到底啦",
|
|
27
|
+
"config": {
|
|
28
|
+
"showFilesInKnowledgeBase": "顯示知識庫中內容"
|
|
29
|
+
},
|
|
30
|
+
"emptyStatus": {
|
|
31
|
+
"actions": {
|
|
32
|
+
"file": "上傳文件",
|
|
33
|
+
"folder": "上傳文件夾",
|
|
34
|
+
"knowledgeBase": "新建知識庫"
|
|
35
|
+
},
|
|
36
|
+
"or": "或者",
|
|
37
|
+
"title": "將文件或文件夾拖到這裡"
|
|
38
|
+
},
|
|
39
|
+
"title": {
|
|
40
|
+
"createdAt": "創建時間",
|
|
41
|
+
"size": "大小",
|
|
42
|
+
"title": "文件"
|
|
43
|
+
},
|
|
44
|
+
"total": {
|
|
45
|
+
"fileCount": "共 {{count}} 項",
|
|
46
|
+
"selectedCount": "已選 {{count}} 項"
|
|
47
|
+
}
|
|
48
|
+
},
|
|
49
|
+
"FileParsingStatus": {
|
|
50
|
+
"chunks": {
|
|
51
|
+
"embeddingStatus": {
|
|
52
|
+
"empty": "文本塊尚未完全向量化,將導致語義檢索功能不可用,為提升檢索質量,請對文本塊向量化",
|
|
53
|
+
"processing": "文本塊正在向量化,請耐心等待",
|
|
54
|
+
"success": "當前文本塊均已向量化"
|
|
55
|
+
},
|
|
56
|
+
"embeddings": "向量化",
|
|
57
|
+
"status": {
|
|
58
|
+
"error": "分塊失敗",
|
|
59
|
+
"errorResult": "分塊失敗,請檢查後重試。失敗原因:",
|
|
60
|
+
"processing": "分塊中",
|
|
61
|
+
"processingTip": "服務端正在拆分文本塊,關閉頁面不影響分塊進度"
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
},
|
|
65
|
+
"GoBack": {
|
|
66
|
+
"back": "返回"
|
|
67
|
+
},
|
|
8
68
|
"ModelSelect": {
|
|
9
69
|
"featureTag": {
|
|
10
70
|
"custom": "自訂模型,預設支援函式呼叫與視覺辨識,請根據實際情況驗證上述能力的可用性",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lobehub/chat",
|
|
3
|
-
"version": "1.11.
|
|
3
|
+
"version": "1.11.3",
|
|
4
4
|
"description": "Lobe Chat - an open-source, high-performance chatbot framework that supports speech synthesis, multimodal, and extensible Function Call plugin system. Supports one-click free deployment of your private ChatGPT/LLM web application.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"framework",
|
|
@@ -5,31 +5,15 @@ import { useTranslation } from 'react-i18next';
|
|
|
5
5
|
import { Flexbox, FlexboxProps } from 'react-layout-kit';
|
|
6
6
|
|
|
7
7
|
import BrandWatermark from '@/components/BrandWatermark';
|
|
8
|
+
import PanelTitle from '@/components/PanelTitle';
|
|
8
9
|
|
|
9
10
|
const useStyles = createStyles(({ token, css }) => ({
|
|
10
11
|
container: css`
|
|
11
|
-
padding-block:
|
|
12
|
+
padding-block: 0 16px;
|
|
12
13
|
padding-inline: 12px;
|
|
13
14
|
background: ${token.colorBgContainer};
|
|
14
15
|
border-inline-end: 1px solid ${token.colorBorder};
|
|
15
16
|
`,
|
|
16
|
-
desc: css`
|
|
17
|
-
line-height: 1.4;
|
|
18
|
-
color: ${token.colorTextDescription};
|
|
19
|
-
`,
|
|
20
|
-
header: css`
|
|
21
|
-
padding-block: 0;
|
|
22
|
-
padding-inline: 0.75rem;
|
|
23
|
-
`,
|
|
24
|
-
logo: css`
|
|
25
|
-
fill: ${token.colorText};
|
|
26
|
-
`,
|
|
27
|
-
title: css`
|
|
28
|
-
margin: 0;
|
|
29
|
-
font-size: 26px;
|
|
30
|
-
font-weight: 600;
|
|
31
|
-
line-height: 1.3;
|
|
32
|
-
`,
|
|
33
17
|
}));
|
|
34
18
|
|
|
35
19
|
interface SidebarLayoutProps extends FlexboxProps {
|
|
@@ -48,10 +32,7 @@ const SidebarLayout = ({ children, className, title, desc, ...rest }: SidebarLay
|
|
|
48
32
|
width={280}
|
|
49
33
|
{...rest}
|
|
50
34
|
>
|
|
51
|
-
<
|
|
52
|
-
<h1 className={styles.title}>{title || t('header.title')}</h1>
|
|
53
|
-
<p className={styles.desc}>{desc || t('header.desc')}</p>
|
|
54
|
-
</Flexbox>
|
|
35
|
+
<PanelTitle desc={desc || t('header.desc')} title={title || t('header.title')} />
|
|
55
36
|
{children}
|
|
56
37
|
<BrandWatermark paddingInline={12} />
|
|
57
38
|
</Flexbox>
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { FileTypeIcon, MaterialFileTypeIcon } from '@lobehub/ui';
|
|
2
|
+
import { memo } from 'react';
|
|
3
|
+
|
|
4
|
+
import { mimeTypeMap } from './config';
|
|
5
|
+
|
|
6
|
+
interface FileListProps {
|
|
7
|
+
fileName: string;
|
|
8
|
+
fileType: string;
|
|
9
|
+
size?: number;
|
|
10
|
+
variant?: 'pure' | 'file' | 'folder';
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
const FileIcon = memo<FileListProps>(({ fileName, size, variant = 'file' }) => {
|
|
14
|
+
if (Object.keys(mimeTypeMap).some((key) => fileName.endsWith(`.${key}`))) {
|
|
15
|
+
const ext = fileName.split('.').pop() as string;
|
|
16
|
+
|
|
17
|
+
return (
|
|
18
|
+
<FileTypeIcon
|
|
19
|
+
color={mimeTypeMap[ext]}
|
|
20
|
+
filetype={ext?.toUpperCase()}
|
|
21
|
+
size={size}
|
|
22
|
+
type={'file'}
|
|
23
|
+
/>
|
|
24
|
+
);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
return <MaterialFileTypeIcon filename={fileName} size={size} type={'file'} variant={variant} />;
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
export default FileIcon;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { App } from 'antd';
|
|
2
|
+
import { ModalFuncProps } from 'antd/es/modal/interface';
|
|
3
|
+
import { MutableRefObject, ReactNode, useRef } from 'react';
|
|
4
|
+
|
|
5
|
+
import { closeIcon, useStyles } from './style';
|
|
6
|
+
|
|
7
|
+
interface CreateModalProps extends ModalFuncProps {
|
|
8
|
+
content: ReactNode;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
interface ModalInstance {
|
|
12
|
+
destroy: (...args: any[]) => void;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
type PropsFunc<T = undefined> = (
|
|
16
|
+
instance: MutableRefObject<ModalInstance | undefined>,
|
|
17
|
+
props?: T,
|
|
18
|
+
) => CreateModalProps;
|
|
19
|
+
|
|
20
|
+
const createModal = <T>(params: CreateModalProps | PropsFunc<T>) => {
|
|
21
|
+
const useModal = () => {
|
|
22
|
+
const { styles } = useStyles();
|
|
23
|
+
const { modal } = App.useApp();
|
|
24
|
+
const instanceRef = useRef<ModalInstance>();
|
|
25
|
+
|
|
26
|
+
const open = (outProps?: T) => {
|
|
27
|
+
const props = typeof params === 'function' ? params(instanceRef, outProps) : params;
|
|
28
|
+
|
|
29
|
+
instanceRef.current = modal.confirm({
|
|
30
|
+
className: styles.content,
|
|
31
|
+
closable: true,
|
|
32
|
+
closeIcon,
|
|
33
|
+
footer: false,
|
|
34
|
+
icon: null,
|
|
35
|
+
wrapClassName: styles.wrap,
|
|
36
|
+
...props,
|
|
37
|
+
});
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
return { open };
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
return useModal;
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
export { createModal };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './createModalHooks';
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { Icon } from '@lobehub/ui';
|
|
2
|
+
import { createStyles } from 'antd-style';
|
|
3
|
+
import { XIcon } from 'lucide-react';
|
|
4
|
+
|
|
5
|
+
export const useStyles = createStyles(({ css, token, prefixCls, isDarkMode, responsive }) => {
|
|
6
|
+
return {
|
|
7
|
+
content: css`
|
|
8
|
+
.${prefixCls}-modal-content {
|
|
9
|
+
overflow: hidden;
|
|
10
|
+
|
|
11
|
+
width: min(90vw, 450px);
|
|
12
|
+
padding: 0;
|
|
13
|
+
|
|
14
|
+
background: ${isDarkMode ? token.colorBgElevated : token.colorBgLayout};
|
|
15
|
+
border: 1px solid ${token.colorSplit};
|
|
16
|
+
border-radius: ${token.borderRadiusLG}px;
|
|
17
|
+
|
|
18
|
+
${responsive.mobile} {
|
|
19
|
+
width: unset;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
.${prefixCls}-modal-confirm-title {
|
|
23
|
+
display: block;
|
|
24
|
+
padding-block: 16px 0;
|
|
25
|
+
padding-inline: 16px;
|
|
26
|
+
}
|
|
27
|
+
.${prefixCls}-modal-confirm-btns {
|
|
28
|
+
margin-block-start: 0;
|
|
29
|
+
padding: 16px;
|
|
30
|
+
}
|
|
31
|
+
`,
|
|
32
|
+
wrap: css`
|
|
33
|
+
overflow: hidden auto;
|
|
34
|
+
backdrop-filter: blur(2px);
|
|
35
|
+
`,
|
|
36
|
+
};
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
export const closeIcon = <Icon icon={XIcon} size={{ fontSize: 20 }} />;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { Icon } from '@lobehub/ui';
|
|
2
|
+
import { createStyles } from 'antd-style';
|
|
3
|
+
import { ArrowLeft } from 'lucide-react';
|
|
4
|
+
import Link from 'next/link';
|
|
5
|
+
import { memo } from 'react';
|
|
6
|
+
import { useTranslation } from 'react-i18next';
|
|
7
|
+
import { Flexbox } from 'react-layout-kit';
|
|
8
|
+
|
|
9
|
+
const useStyles = createStyles(({ css, token }) => {
|
|
10
|
+
return {
|
|
11
|
+
container: css`
|
|
12
|
+
width: fit-content;
|
|
13
|
+
height: 24px;
|
|
14
|
+
padding-inline: 8px;
|
|
15
|
+
|
|
16
|
+
color: ${token.colorTextTertiary};
|
|
17
|
+
|
|
18
|
+
border-radius: 6px;
|
|
19
|
+
|
|
20
|
+
&:hover {
|
|
21
|
+
color: ${token.colorTextSecondary};
|
|
22
|
+
background: ${token.colorFillTertiary};
|
|
23
|
+
}
|
|
24
|
+
`,
|
|
25
|
+
};
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
interface GoBackProps {
|
|
29
|
+
href: string;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const GoBack = memo<GoBackProps>(({ href }) => {
|
|
33
|
+
const { t } = useTranslation('components');
|
|
34
|
+
const { styles } = useStyles();
|
|
35
|
+
|
|
36
|
+
return (
|
|
37
|
+
<Link href={href}>
|
|
38
|
+
<Flexbox align={'center'} className={styles.container} gap={4} horizontal>
|
|
39
|
+
<Icon icon={ArrowLeft} />
|
|
40
|
+
<div>{t('GoBack.back')}</div>
|
|
41
|
+
</Flexbox>
|
|
42
|
+
</Link>
|
|
43
|
+
);
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
export default GoBack;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { createStyles } from 'antd-style';
|
|
4
|
+
import { CSSProperties, memo } from 'react';
|
|
5
|
+
import { Flexbox } from 'react-layout-kit';
|
|
6
|
+
|
|
7
|
+
const useStyles = createStyles(({ token, css }) => ({
|
|
8
|
+
desc: css`
|
|
9
|
+
line-height: 1.4;
|
|
10
|
+
color: ${token.colorTextDescription};
|
|
11
|
+
`,
|
|
12
|
+
header: css`
|
|
13
|
+
padding-block: 24px 0;
|
|
14
|
+
padding-inline: 0.75rem;
|
|
15
|
+
`,
|
|
16
|
+
title: css`
|
|
17
|
+
margin: 0;
|
|
18
|
+
font-size: 26px;
|
|
19
|
+
font-weight: 600;
|
|
20
|
+
line-height: 1.3;
|
|
21
|
+
`,
|
|
22
|
+
}));
|
|
23
|
+
|
|
24
|
+
interface PanelTitleProps {
|
|
25
|
+
desc?: string;
|
|
26
|
+
style?: CSSProperties;
|
|
27
|
+
title?: string;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const PanelTitle = memo(({ title, desc, style }: PanelTitleProps) => {
|
|
31
|
+
const { styles } = useStyles();
|
|
32
|
+
|
|
33
|
+
return (
|
|
34
|
+
<Flexbox className={styles.header} gap={4} style={style}>
|
|
35
|
+
<h1 className={styles.title}>{title}</h1>
|
|
36
|
+
<p className={styles.desc}>{desc}</p>
|
|
37
|
+
</Flexbox>
|
|
38
|
+
);
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
export default PanelTitle;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { Icon } from '@lobehub/ui';
|
|
2
|
+
import { useTheme } from 'antd-style';
|
|
3
|
+
import { BookTextIcon } from 'lucide-react';
|
|
4
|
+
import { memo } from 'react';
|
|
5
|
+
|
|
6
|
+
interface RepoIconProps {
|
|
7
|
+
size?: number;
|
|
8
|
+
}
|
|
9
|
+
const RepoIcon = memo<RepoIconProps>(({ size = 20 }) => {
|
|
10
|
+
const theme = useTheme();
|
|
11
|
+
|
|
12
|
+
return (
|
|
13
|
+
<Icon
|
|
14
|
+
color={theme.geekblue}
|
|
15
|
+
fill={theme.geekblue3}
|
|
16
|
+
icon={BookTextIcon}
|
|
17
|
+
size={{ fontSize: size }}
|
|
18
|
+
/>
|
|
19
|
+
);
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
export default RepoIcon;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createStyles } from 'antd-style';
|
|
2
|
-
import { type ReactNode, memo } from 'react';
|
|
2
|
+
import { CSSProperties, type ReactNode, memo } from 'react';
|
|
3
3
|
import { Flexbox } from 'react-layout-kit';
|
|
4
4
|
|
|
5
5
|
const useStyles = createStyles(({ css }) => ({
|
|
@@ -10,10 +10,11 @@ const useStyles = createStyles(({ css }) => ({
|
|
|
10
10
|
|
|
11
11
|
interface SidebarHeaderProps {
|
|
12
12
|
actions?: ReactNode;
|
|
13
|
+
style?: CSSProperties;
|
|
13
14
|
title: ReactNode;
|
|
14
15
|
}
|
|
15
16
|
|
|
16
|
-
const SidebarHeader = memo<SidebarHeaderProps>(({ title, actions }) => {
|
|
17
|
+
const SidebarHeader = memo<SidebarHeaderProps>(({ title, style, actions }) => {
|
|
17
18
|
const { styles } = useStyles();
|
|
18
19
|
|
|
19
20
|
return (
|
|
@@ -24,6 +25,7 @@ const SidebarHeader = memo<SidebarHeaderProps>(({ title, actions }) => {
|
|
|
24
25
|
horizontal
|
|
25
26
|
padding={14}
|
|
26
27
|
paddingInline={16}
|
|
28
|
+
style={style}
|
|
27
29
|
>
|
|
28
30
|
<Flexbox align={'center'} gap={4} horizontal>
|
|
29
31
|
{title}
|