@lobehub/chat 0.118.10 → 0.119.1

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.
Files changed (101) hide show
  1. package/CHANGELOG.md +61 -0
  2. package/README.md +8 -8
  3. package/README.zh-CN.md +8 -8
  4. package/docs/Home.md +1 -1
  5. package/docs/_Sidebar.md +1 -1
  6. package/locales/de-DE/chat.json +10 -0
  7. package/locales/de-DE/common.json +1 -0
  8. package/locales/de-DE/error.json +4 -4
  9. package/locales/en-US/chat.json +10 -0
  10. package/locales/en-US/common.json +1 -0
  11. package/locales/en-US/error.json +1 -1
  12. package/locales/es-ES/chat.json +10 -0
  13. package/locales/es-ES/common.json +1 -0
  14. package/locales/fr-FR/chat.json +10 -0
  15. package/locales/fr-FR/common.json +1 -0
  16. package/locales/fr-FR/error.json +1 -2
  17. package/locales/it-IT/chat.json +10 -0
  18. package/locales/it-IT/common.json +1 -0
  19. package/locales/it-IT/error.json +5 -5
  20. package/locales/ja-JP/chat.json +10 -0
  21. package/locales/ja-JP/common.json +1 -0
  22. package/locales/ko-KR/chat.json +10 -0
  23. package/locales/ko-KR/common.json +1 -0
  24. package/locales/ko-KR/error.json +4 -4
  25. package/locales/nl-NL/chat.json +10 -0
  26. package/locales/nl-NL/common.json +1 -0
  27. package/locales/pl-PL/chat.json +10 -0
  28. package/locales/pl-PL/common.json +1 -0
  29. package/locales/pl-PL/error.json +2 -3
  30. package/locales/pt-BR/chat.json +10 -0
  31. package/locales/pt-BR/common.json +1 -0
  32. package/locales/ru-RU/chat.json +10 -0
  33. package/locales/ru-RU/common.json +1 -0
  34. package/locales/ru-RU/error.json +3 -3
  35. package/locales/tr-TR/chat.json +10 -0
  36. package/locales/tr-TR/common.json +1 -0
  37. package/locales/vi-VN/chat.json +10 -0
  38. package/locales/vi-VN/common.json +1 -0
  39. package/locales/vi-VN/error.json +1 -1
  40. package/locales/zh-CN/chat.json +10 -0
  41. package/locales/zh-CN/common.json +1 -0
  42. package/locales/zh-TW/chat.json +10 -0
  43. package/locales/zh-TW/common.json +1 -0
  44. package/package.json +6 -6
  45. package/src/app/chat/(desktop)/features/Conversation.tsx +17 -0
  46. package/src/app/chat/(desktop)/features/HotKeys.tsx +44 -0
  47. package/src/app/chat/(desktop)/index.tsx +2 -3
  48. package/src/app/chat/features/ChatHeader/ShareButton/Preview.tsx +1 -1
  49. package/src/app/chat/features/SessionListContent/List/Item/Actions.tsx +24 -3
  50. package/src/app/chat/features/TopicListContent/Topic/TopicContent.tsx +43 -2
  51. package/src/database/models/__tests__/message.test.ts +48 -0
  52. package/src/database/models/__tests__/topic.test.ts +135 -0
  53. package/src/database/models/message.ts +35 -0
  54. package/src/database/models/session.ts +11 -1
  55. package/src/database/models/topic.ts +34 -2
  56. package/src/features/ChatInput/ActionBar/Clear.tsx +0 -6
  57. package/src/features/Conversation/Actions/Assistant.tsx +16 -5
  58. package/src/features/Conversation/Actions/Error.tsx +2 -2
  59. package/src/features/Conversation/Actions/Fallback.tsx +4 -3
  60. package/src/features/Conversation/Actions/Function.tsx +3 -3
  61. package/src/features/Conversation/Actions/User.tsx +3 -3
  62. package/src/features/Conversation/Actions/customAction.ts +2 -4
  63. package/src/features/Conversation/Actions/index.ts +50 -45
  64. package/src/features/Conversation/Error/InvalidAccess.tsx +1 -1
  65. package/src/features/Conversation/Error/OpenAPIKey.tsx +1 -1
  66. package/src/features/Conversation/Error/OpenAiBizError.tsx +1 -1
  67. package/src/features/Conversation/Error/Plugin/PluginError.tsx +1 -1
  68. package/src/features/Conversation/Error/Plugin/PluginSettings.tsx +1 -1
  69. package/src/features/Conversation/Error/index.tsx +2 -2
  70. package/src/features/Conversation/Extras/Assistant.tsx +32 -29
  71. package/src/features/Conversation/Extras/User.tsx +2 -1
  72. package/src/features/Conversation/Extras/index.ts +4 -4
  73. package/src/features/Conversation/Messages/index.ts +3 -3
  74. package/src/features/Conversation/components/ChatItem/ActionsBar.tsx +58 -0
  75. package/src/features/Conversation/components/ChatItem/index.tsx +126 -0
  76. package/src/features/Conversation/components/ChatList/HistoryDivider.tsx +6 -3
  77. package/src/features/Conversation/components/ChatList/index.tsx +35 -79
  78. package/src/features/Conversation/hooks/useChatListActionsBar.tsx +43 -31
  79. package/src/features/Conversation/hooks/useInitConversation.ts +4 -1
  80. package/src/features/Conversation/index.tsx +4 -3
  81. package/src/features/Conversation/types/index.tsx +35 -0
  82. package/src/features/PluginStore/PluginItem/EditCustomPlugin.tsx +7 -2
  83. package/src/locales/default/chat.ts +10 -1
  84. package/src/locales/default/common.ts +1 -0
  85. package/src/services/config.ts +22 -0
  86. package/src/services/session.ts +6 -0
  87. package/src/services/topic.ts +4 -0
  88. package/src/store/chat/slices/message/action.ts +89 -2
  89. package/src/store/chat/slices/message/selectors.ts +10 -0
  90. package/src/store/chat/slices/topic/action.ts +22 -0
  91. package/src/store/global/slices/common/action.ts +2 -0
  92. package/src/store/session/slices/session/action.test.ts +136 -0
  93. package/src/store/session/slices/session/action.ts +26 -6
  94. package/src/types/topic.ts +1 -0
  95. package/src/utils/fetch.test.ts +131 -0
  96. package/src/utils/fetch.ts +26 -10
  97. package/src/features/Conversation/components/ChatList/ActionsBar.tsx +0 -27
  98. package/src/features/Conversation/components/ChatList/Item.tsx +0 -236
  99. package/src/features/Conversation/container/index.tsx +0 -83
  100. /package/docs/Development/{Steup-Development.md → Setup-Development.md} +0 -0
  101. /package/docs/Development/{Steup-Development.zh-CN.md → Setup-Development.zh-CN.md} +0 -0
@@ -7,12 +7,17 @@
7
7
  "confirmRemoveSessionItemAlert": "Czy na pewno chcesz usunąć tego asystenta? Tej operacji nie można cofnąć.",
8
8
  "defaultAgent": "Domyślny asystent",
9
9
  "defaultSession": "Domyślna sesja",
10
+ "duplicateTitle": "{{title}} kopia",
10
11
  "historyRange": "Zakres historii",
11
12
  "inbox": {
12
13
  "defaultMessage": "Cześć, jestem twoim inteligentnym asystentem, możesz zadać mi dowolne pytanie, postaram się na nie odpowiedzieć. Jeśli potrzebujesz bardziej profesjonalnego lub spersonalizowanego asystenta, kliknij `+`, aby utworzyć niestandardowego asystenta.",
13
14
  "desc": "Włącz klastry mózgów, rozpal iskrę myślenia. Twój inteligentny asystent, gotowy do rozmowy o wszystkim.",
14
15
  "title": "Pogadajmy sobie"
15
16
  },
17
+ "messageAction": {
18
+ "delAndRegenerate": "Usuń i wygeneruj ponownie",
19
+ "regenerate": "Wygeneruj ponownie"
20
+ },
16
21
  "newAgent": "Nowy asystent",
17
22
  "noDescription": "Brak opisu",
18
23
  "pin": "Przypnij",
@@ -48,6 +53,11 @@
48
53
  "used": "Użyte"
49
54
  },
50
55
  "topic": {
56
+ "actions": {
57
+ "autoRename": "Automatyczna zmiana nazwy",
58
+ "duplicate": "Utwórz kopię",
59
+ "export": "Eksportuj temat"
60
+ },
51
61
  "confirmRemoveAll": "Czy na pewno chcesz usunąć wszystkie tematy? Tej operacji nie można cofnąć. Proszę potwierdź swoją decyzję.",
52
62
  "confirmRemoveTopic": "Czy na pewno chcesz usunąć ten temat? Tej operacji nie można cofnąć. Proszę potwierdź swoją decyzję.",
53
63
  "confirmRemoveUnstarred": "Czy na pewno chcesz usunąć nieoznaczone tematy? Tej operacji nie można cofnąć. Proszę potwierdź swoją decyzję.",
@@ -17,6 +17,7 @@
17
17
  "defaultAgent": "Domyślny asystent",
18
18
  "defaultSession": "Domyślna sesja",
19
19
  "delete": "Usuń",
20
+ "duplicate": "Utwórz kopię",
20
21
  "edit": "Edytuj",
21
22
  "export": "Eksportuj ustawienia",
22
23
  "exportType": {
@@ -9,9 +9,6 @@
9
9
  "403": "Przepraszamy, serwer odrzucił Twoje żądanie, nie masz uprawnień dostępu do tego zasobu",
10
10
  "404": "Przepraszamy, serwer nie może odnaleźć żądanej strony lub zasobu. Proszę sprawdź, czy URL jest poprawny",
11
11
  "405": "Przepraszamy, serwer nie obsługuje używanej metody żądania. Proszę sprawdź, czy metoda żądania jest poprawna",
12
- "429": "Przepraszamy, Twoje żądanie jest zbyt częste, serwer jest trochę przeciążony. Proszę spróbuj ponownie później",
13
- "500": "Przepraszamy, serwer napotkał pewne trudności i tymczasowo nie może zrealizować Twojego żądania. Proszę spróbuj ponownie później",
14
- "502": "Przepraszamy, serwer wydaje się zgubić kierunek i tymczasowo nie może świadczyć usług. Proszę spróbuj ponownie później",
15
12
  "406": "Przepraszamy, serwer nie może zrealizować żądania zgodnie z żądanymi właściwościami zasobu",
16
13
  "407": "Przepraszamy, aby kontynuować to żądanie, musisz najpierw uwierzytelnić się jako proxy",
17
14
  "408": "Przepraszamy, serwer przekroczył limit czasu oczekiwania na żądanie, sprawdź swoje połączenie sieciowe i spróbuj ponownie",
@@ -32,6 +29,8 @@
32
29
  "429": "Przepraszamy, Twoje żądania są zbyt liczne, serwer jest trochę przeciążony, spróbuj ponownie później",
33
30
  "431": "Przepraszamy, nagłówek żądania jest zbyt duży, serwer nie może go przetworzyć",
34
31
  "451": "Przepraszamy, z powodów prawnych serwer odmawia dostarczenia tego zasobu",
32
+ "500": "Przepraszamy, serwer napotkał pewne trudności i tymczasowo nie może zrealizować Twojego żądania. Proszę spróbuj ponownie później",
33
+ "502": "Przepraszamy, serwer wydaje się zgubić kierunek i tymczasowo nie może świadczyć usług. Proszę spróbuj ponownie później",
35
34
  "503": "Przepraszamy, serwer tymczasowo nie może przetworzyć Twojego żądania, prawdopodobnie z powodu przeciążenia lub konserwacji. Proszę spróbuj ponownie później",
36
35
  "504": "Przepraszamy, serwer nie otrzymał odpowiedzi od serwera nadrzędnego. Proszę spróbuj ponownie później",
37
36
  "InvalidAccessCode": "Nieprawidłowe lub puste hasło dostępu. Proszę podaj poprawne hasło dostępu lub dodaj niestandardowy klucz API OpenAI",
@@ -7,12 +7,17 @@
7
7
  "confirmRemoveSessionItemAlert": "Você está prestes a remover este assistente. Depois de remover, não será possível recuperá-lo. Por favor, confirme sua ação.",
8
8
  "defaultAgent": "Assistente Padrão",
9
9
  "defaultSession": "Sessão Padrão",
10
+ "duplicateTitle": "{{title}} Cópia",
10
11
  "historyRange": "Intervalo de Histórico",
11
12
  "inbox": {
12
13
  "defaultMessage": "Olá, eu sou seu assistente virtual, você pode me perguntar qualquer coisa e eu farei o meu melhor para responder. Se precisar de um assistente mais profissional ou personalizado, clique em `+` para criar um assistente personalizado.",
13
14
  "desc": "Ative o cluster cerebral, inspire faíscas de pensamento. Seu assistente inteligente, aqui para conversar sobre tudo.",
14
15
  "title": "Conversa Aleatória"
15
16
  },
17
+ "messageAction": {
18
+ "delAndRegenerate": "Excluir e Regenerar",
19
+ "regenerate": "Regenerar"
20
+ },
16
21
  "newAgent": "Novo Assistente",
17
22
  "noDescription": "Sem descrição",
18
23
  "pin": "Fixar",
@@ -48,6 +53,11 @@
48
53
  "used": "Usado"
49
54
  },
50
55
  "topic": {
56
+ "actions": {
57
+ "autoRename": "Renomeação Automática",
58
+ "duplicate": "Criar Cópia",
59
+ "export": "Exportar Tópico"
60
+ },
51
61
  "confirmRemoveAll": "Você está prestes a remover todos os tópicos. Depois de remover, não será possível recuperá-los. Por favor, confirme sua ação.",
52
62
  "confirmRemoveTopic": "Você está prestes a remover este tópico. Depois de remover, não será possível recuperá-lo. Por favor, confirme sua ação.",
53
63
  "confirmRemoveUnstarred": "Você está prestes a remover os tópicos não favoritados. Depois de remover, não será possível recuperá-los. Por favor, confirme sua ação.",
@@ -17,6 +17,7 @@
17
17
  "defaultAgent": "Assistente padrão",
18
18
  "defaultSession": "Sessão padrão",
19
19
  "delete": "Excluir",
20
+ "duplicate": "Duplicar",
20
21
  "edit": "Editar",
21
22
  "export": "Exportar configuração",
22
23
  "exportType": {
@@ -7,12 +7,17 @@
7
7
  "confirmRemoveSessionItemAlert": "Вы уверены, что хотите удалить этого помощника? После этого его нельзя будет восстановить.",
8
8
  "defaultAgent": "Пользовательский помощник",
9
9
  "defaultSession": "Пользовательский помощник",
10
+ "duplicateTitle": "{{title}} Копия",
10
11
  "historyRange": "История сообщений",
11
12
  "inbox": {
12
13
  "defaultMessage": "Привет, я твой виртуальный помощник. Ты можешь задать мне любой вопрос, и я постараюсь на него ответить. Если тебе нужен более профессиональный или настраиваемый помощник, нажми на `+`, чтобы создать пользовательского помощника.",
13
14
  "desc": "Зажги искру мысли, открой кластер мозгов. Твой виртуальный ассистент, готовый обсудить все с тобой.",
14
15
  "title": "Просто поболтаем"
15
16
  },
17
+ "messageAction": {
18
+ "delAndRegenerate": "Удалить и пересоздать",
19
+ "regenerate": "Пересоздать"
20
+ },
16
21
  "newAgent": "Создать помощника",
17
22
  "noDescription": "Нет описания",
18
23
  "pin": "Закрепить",
@@ -48,6 +53,11 @@
48
53
  "used": "Использовано"
49
54
  },
50
55
  "topic": {
56
+ "actions": {
57
+ "autoRename": "Умное переименование",
58
+ "duplicate": "Создать копию",
59
+ "export": "Экспорт темы"
60
+ },
51
61
  "confirmRemoveAll": "Вы уверены, что хотите удалить все темы? После этого их нельзя будет восстановить.",
52
62
  "confirmRemoveTopic": "Вы уверены, что хотите удалить эту тему? После этого ее нельзя будет восстановить.",
53
63
  "confirmRemoveUnstarred": "Вы уверены, что хотите удалить неотмеченные темы? После этого их нельзя будет восстановить.",
@@ -17,6 +17,7 @@
17
17
  "defaultAgent": "Пользовательский агент",
18
18
  "defaultSession": "Пользовательский агент",
19
19
  "delete": "Удалить",
20
+ "duplicate": "Создать копию",
20
21
  "edit": "Редактировать",
21
22
  "export": "Экспорт настроек",
22
23
  "exportType": {
@@ -9,9 +9,6 @@
9
9
  "403": "Извините, сервер отклонил ваш запрос. У вас нет разрешения на доступ к этому содержимому",
10
10
  "404": "Извините, сервер не может найти запрошенную вами страницу или ресурс. Убедитесь, что ваш URL-адрес указан правильно.",
11
11
  "405": "К сожалению, сервер не поддерживает используемый вами метод запроса. Убедитесь, что ваш метод запроса правильный.",
12
- "429": "Извините, ваш запрос слишком частый, и сервер немного устал. Повторите попытку позже.",
13
- "500": "К сожалению, сервер, похоже, испытывает некоторые трудности и временно не может выполнить ваш запрос. Повторите попытку позже.",
14
- "502": "К сожалению, сервер, похоже, потерян и временно не может предоставлять услуги. Повторите попытку позже.",
15
12
  "406": "Извините, сервер не может выполнить запрос в соответствии с характеристиками запрошенного контента",
16
13
  "407": "Извините, для продолжения запроса необходима аутентификация прокси",
17
14
  "408": "Извините, сервер превысил время ожидания при ожидании запроса. Пожалуйста, проверьте свое сетевое подключение и повторите попытку",
@@ -29,8 +26,11 @@
29
26
  "424": "Извините, из-за предыдущей неудачной попытки запрос не может быть выполнен",
30
27
  "426": "Извините, сервер требует обновления вашего клиента до более новой версии протокола",
31
28
  "428": "Извините, сервер требует предварительных условий, ваш запрос должен содержать правильные условные заголовки",
29
+ "429": "Извините, ваш запрос слишком частый, и сервер немного устал. Повторите попытку позже.",
32
30
  "431": "Извините, ваш заголовок запроса слишком велик, сервер не может его обработать",
33
31
  "451": "Извините, по юридическим причинам сервер отказывается предоставить этот ресурс",
32
+ "500": "К сожалению, сервер, похоже, испытывает некоторые трудности и временно не может выполнить ваш запрос. Повторите попытку позже.",
33
+ "502": "К сожалению, сервер, похоже, потерян и временно не может предоставлять услуги. Повторите попытку позже.",
34
34
  "503": "К сожалению, сервер в настоящее время не может обработать ваш запрос, возможно, из-за перегрузки или технического обслуживания. Повторите попытку позже.",
35
35
  "504": "К сожалению, сервер не получил ответа от вышестоящего сервера. Повторите попытку позже.",
36
36
  "InvalidAccessCode": "Пароль неверен или пуст. Введите правильный пароль доступа или добавьте собственный ключ API OpenAI.",
@@ -7,12 +7,17 @@
7
7
  "confirmRemoveSessionItemAlert": "Bu asistanı silmek üzeresiniz. Silindikten sonra geri alınamaz. Lütfen eyleminizi onaylayın.",
8
8
  "defaultAgent": "Varsayılan Asistan",
9
9
  "defaultSession": "Varsayılan Asistan",
10
+ "duplicateTitle": "{{title}} Kopya",
10
11
  "historyRange": "Geçmiş Aralığı",
11
12
  "inbox": {
12
13
  "defaultMessage": "Merhaba, ben sanal asistanınızım. Bana herhangi bir şey sorabilirsiniz ve size cevap vermek için elimden geleni yapacağım. Daha profesyonel veya özelleştirilmiş bir asistana ihtiyacınız varsa, özel bir asistan oluşturmak için `+` simgesine tıklayabilirsiniz.",
13
14
  "desc": "Beyin fırtınasını başlatın ve yaratıcı düşünmeye başlayın. Sanal asistanınız burada, her konuda sizinle iletişim kurmak için hazır.",
14
15
  "title": "Sohbet Et"
15
16
  },
17
+ "messageAction": {
18
+ "delAndRegenerate": "Sil ve Yeniden Oluştur",
19
+ "regenerate": "Yeniden Oluştur"
20
+ },
16
21
  "newAgent": "Yeni Asistan",
17
22
  "noDescription": "Açıklama yok",
18
23
  "pin": "Pin",
@@ -48,6 +53,11 @@
48
53
  "used": "Kullanılan"
49
54
  },
50
55
  "topic": {
56
+ "actions": {
57
+ "autoRename": "Akıllı Yeniden Adlandırma",
58
+ "duplicate": "Kopya Oluştur",
59
+ "export": "Konuyu Dışa Aktar"
60
+ },
51
61
  "confirmRemoveAll": "Tüm konuları silmek üzeresiniz. Bir kere silindiğinde, geri alınamazlar. Lütfen dikkatli bir şekilde devam edin.",
52
62
  "confirmRemoveTopic": "Bu konuyu silmek üzeresiniz. Bir kere silindiğinde, geri alınamaz. Lütfen dikkatli bir şekilde devam edin.",
53
63
  "confirmRemoveUnstarred": "Yıldızlanmamış konuları silmek üzeresiniz. Bir kere silindiğinde, geri alınamazlar. Lütfen dikkatli bir şekilde devam edin.",
@@ -17,6 +17,7 @@
17
17
  "defaultAgent": "Varsayılan Asistan",
18
18
  "defaultSession": "Varsayılan Asistan",
19
19
  "delete": "Sil",
20
+ "duplicate": "Kopya oluştur",
20
21
  "edit": "Düzenle",
21
22
  "export": "Dışa Aktar",
22
23
  "exportType": {
@@ -7,12 +7,17 @@
7
7
  "confirmRemoveSessionItemAlert": "Bạn sắp xóa trợ lý này. Hành động này không thể hoàn tác, vui lòng xác nhận.",
8
8
  "defaultAgent": "Trợ lý mặc định",
9
9
  "defaultSession": "Trợ lý mặc định",
10
+ "duplicateTitle": "{{title}} Bản sao",
10
11
  "historyRange": "Phạm vi lịch sử",
11
12
  "inbox": {
12
13
  "defaultMessage": "Xin chào, tôi là trợ lý thông minh của bạn, bạn có thể hỏi tôi bất kỳ câu hỏi nào và tôi sẽ cố gắng trả lời. Nếu bạn cần một trợ lý chuyên nghiệp hoặc tùy chỉnh hơn, hãy nhấn `+` để tạo trợ lý tùy chỉnh.",
13
14
  "desc": "Kích hoạt cụm não, khơi dậy tia lửa tư duy. Trợ lý thông minh của bạn, ở đây để trò chuyện với bạn về mọi thứ.",
14
15
  "title": "Chuyện phiếm"
15
16
  },
17
+ "messageAction": {
18
+ "delAndRegenerate": "Xóa và tạo lại",
19
+ "regenerate": "Tạo lại"
20
+ },
16
21
  "newAgent": "Tạo trợ lý mới",
17
22
  "noDescription": "Chưa có mô tả",
18
23
  "pin": "Ghim",
@@ -48,6 +53,11 @@
48
53
  "used": "Đã sử dụng"
49
54
  },
50
55
  "topic": {
56
+ "actions": {
57
+ "autoRename": "Đổi tên tự động",
58
+ "duplicate": "Tạo bản sao",
59
+ "export": "Xuất chủ đề"
60
+ },
51
61
  "confirmRemoveAll": "Bạn sắp xóa tất cả chủ đề. Hành động này không thể hoàn tác, vui lòng xác nhận.",
52
62
  "confirmRemoveTopic": "Bạn sắp xóa chủ đề này. Hành động này không thể hoàn tác, vui lòng xác nhận.",
53
63
  "confirmRemoveUnstarred": "Bạn sắp xóa các chủ đề chưa được đánh dấu. Hành động này không thể hoàn tác, vui lòng xác nhận.",
@@ -17,6 +17,7 @@
17
17
  "defaultAgent": "Trợ lý mặc định",
18
18
  "defaultSession": "Phiên mặc định",
19
19
  "delete": "Xóa",
20
+ "duplicate": "Tạo bản sao",
20
21
  "edit": "Chỉnh sửa",
21
22
  "export": "Xuất cấu hình",
22
23
  "exportType": {
@@ -9,7 +9,6 @@
9
9
  "403": "Xin lỗi, máy chủ từ chối yêu cầu của bạn, bạn không có quyền truy cập nội dung này",
10
10
  "404": "Xin lỗi, máy chủ không tìm thấy trang hoặc tài nguyên bạn yêu cầu, vui lòng xác nhận URL của bạn có đúng không",
11
11
  "405": "Xin lỗi, máy chủ không hỗ trợ phương thức yêu cầu bạn đang sử dụng, vui lòng xác nhận phương thức yêu cầu của bạn có đúng không",
12
- "429": "Xin lỗi, yêu cầu của bạn quá nhiều, máy chủ hơi mệt, vui lòng thử lại sau",
13
12
  "406": "Xin lỗi, máy chủ không thể hoàn thành yêu cầu dựa trên đặc tính nội dung bạn yêu cầu",
14
13
  "407": "Xin lỗi, bạn cần xác thực proxy trước khi tiếp tục yêu cầu này",
15
14
  "408": "Xin lỗi, máy chủ đã vượt quá thời gian chờ khi đang chờ đợi yêu cầu, vui lòng kiểm tra kết nối mạng của bạn và thử lại",
@@ -27,6 +26,7 @@
27
26
  "424": "Xin lỗi, yêu cầu hiện tại không thể hoàn thành do yêu cầu trước đó thất bại",
28
27
  "426": "Xin lỗi, máy chủ yêu cầu bạn nâng cấp phiên bản giao thức của khách hàng lên cao hơn",
29
28
  "428": "Xin lỗi, máy chủ yêu cầu điều kiện tiên quyết, yêu cầu của bạn phải chứa tiêu đề điều kiện chính xác",
29
+ "429": "Xin lỗi, yêu cầu của bạn quá nhiều, máy chủ hơi mệt, vui lòng thử lại sau",
30
30
  "431": "Xin lỗi, trường tiêu đề yêu cầu của bạn quá lớn, máy chủ không thể xử lý",
31
31
  "451": "Xin lỗi, do lý do pháp lý, máy chủ từ chối cung cấp tài nguyên này",
32
32
  "500": "Xin lỗi, máy chủ có vẻ gặp một số khó khăn, tạm thời không thể hoàn thành yêu cầu của bạn, vui lòng thử lại sau",
@@ -7,12 +7,17 @@
7
7
  "confirmRemoveSessionItemAlert": "即将删除该助手,删除后该将无法找回,请确认你的操作",
8
8
  "defaultAgent": "自定义助手",
9
9
  "defaultSession": "自定义助手",
10
+ "duplicateTitle": "{{title}} 副本",
10
11
  "historyRange": "历史范围",
11
12
  "inbox": {
12
13
  "defaultMessage": "你好,我是你的智能助手,你可以问我任何问题,我会尽力回答你。如果需要获得更加专业或定制的助手,可以点击`+`创建自定义助手",
13
14
  "desc": "开启大脑集群,激发思维火花。你的智能助理,在这里与你交流一切",
14
15
  "title": "随便聊聊"
15
16
  },
17
+ "messageAction": {
18
+ "delAndRegenerate": "删除并重新生成",
19
+ "regenerate": "重新生成"
20
+ },
16
21
  "newAgent": "新建助手",
17
22
  "noDescription": "暂无描述",
18
23
  "pin": "置顶",
@@ -48,6 +53,11 @@
48
53
  "used": "使用"
49
54
  },
50
55
  "topic": {
56
+ "actions": {
57
+ "autoRename": "智能重命名",
58
+ "duplicate": "创建副本",
59
+ "export": "导出话题"
60
+ },
51
61
  "confirmRemoveAll": "即将删除全部话题,删除后将不可恢复,请谨慎操作。",
52
62
  "confirmRemoveTopic": "即将删除该话题,删除后将不可恢复,请谨慎操作。",
53
63
  "confirmRemoveUnstarred": "即将删除未收藏话题,删除后将不可恢复,请谨慎操作。",
@@ -17,6 +17,7 @@
17
17
  "defaultAgent": "自定义助手",
18
18
  "defaultSession": "自定义助手",
19
19
  "delete": "删除",
20
+ "duplicate": "创建副本",
20
21
  "edit": "编辑",
21
22
  "export": "导出配置",
22
23
  "exportType": {
@@ -7,12 +7,17 @@
7
7
  "confirmRemoveSessionItemAlert": "即將刪除該助手,刪除後將無法找回,請確認你的操作",
8
8
  "defaultAgent": "自定義助手",
9
9
  "defaultSession": "自定義助手",
10
+ "duplicateTitle": "{{title}} 副本",
10
11
  "historyRange": "歷史範圍",
11
12
  "inbox": {
12
13
  "defaultMessage": "你好,我是你的智能助手,你可以問我任何問題,我會盡力回答你。如果需要獲得更專業或定制的助手,可以點擊`+`創建自定義助手",
13
14
  "desc": "開啟大腦集群,激發思維火花。你的智能助理,在這裡與你交流一切",
14
15
  "title": "隨便聊聊"
15
16
  },
17
+ "messageAction": {
18
+ "delAndRegenerate": "刪除並重新生成",
19
+ "regenerate": "重新生成"
20
+ },
16
21
  "newAgent": "新建助手",
17
22
  "noDescription": "暫無描述",
18
23
  "pin": "置頂",
@@ -48,6 +53,11 @@
48
53
  "used": "使用"
49
54
  },
50
55
  "topic": {
56
+ "actions": {
57
+ "autoRename": "智能重新命名",
58
+ "duplicate": "建立副本",
59
+ "export": "匯出主題"
60
+ },
51
61
  "confirmRemoveAll": "即將刪除全部話題,刪除後將不可恢復,請謹慎操作。",
52
62
  "confirmRemoveTopic": "即將刪除該話題,刪除後將不可恢復,請謹慎操作。",
53
63
  "confirmRemoveUnstarred": "即將刪除未收藏話題,刪除後將不可恢復,請謹慎操作。",
@@ -17,6 +17,7 @@
17
17
  "defaultAgent": "預設助手",
18
18
  "defaultSession": "預設助手",
19
19
  "delete": "刪除",
20
+ "duplicate": "建立副本",
20
21
  "edit": "編輯",
21
22
  "export": "匯出設定",
22
23
  "exportType": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lobehub/chat",
3
- "version": "0.118.10",
3
+ "version": "0.119.1",
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",
@@ -81,7 +81,7 @@
81
81
  "@vercel/analytics": "^1",
82
82
  "ahooks": "^3",
83
83
  "ai": "^2.2.22",
84
- "antd": "5.12.5",
84
+ "antd": "^5.12.7",
85
85
  "antd-style": "^3",
86
86
  "brotli-wasm": "^1",
87
87
  "chroma-js": "^2",
@@ -107,7 +107,7 @@
107
107
  "query-string": "^8",
108
108
  "react": "^18",
109
109
  "react-dom": "^18",
110
- "react-hotkeys-hook": "^4",
110
+ "react-hotkeys-hook": "^4.4.3",
111
111
  "react-i18next": "^14.0.0",
112
112
  "react-intersection-observer": "^9",
113
113
  "react-layout-kit": "^1",
@@ -133,7 +133,7 @@
133
133
  },
134
134
  "devDependencies": {
135
135
  "@commitlint/cli": "^18",
136
- "@ducanh2912/next-pwa": "^9",
136
+ "@ducanh2912/next-pwa": "^10",
137
137
  "@lobehub/i18n-cli": "latest",
138
138
  "@lobehub/lint": "latest",
139
139
  "@next/bundle-analyzer": "^14",
@@ -152,7 +152,7 @@
152
152
  "@types/ua-parser-js": "^0.7",
153
153
  "@types/uuid": "^9",
154
154
  "@umijs/lint": "^4",
155
- "@vitest/coverage-v8": "^1",
155
+ "@vitest/coverage-v8": "1.1.1",
156
156
  "commitlint": "^18",
157
157
  "consola": "^3",
158
158
  "dpdm": "^3",
@@ -176,7 +176,7 @@
176
176
  "typescript": "^5",
177
177
  "unified": "^11",
178
178
  "unist-util-visit": "^5",
179
- "vitest": "^1",
179
+ "vitest": "1.1.1",
180
180
  "vitest-canvas-mock": "^0.3.3"
181
181
  },
182
182
  "publishConfig": {
@@ -0,0 +1,17 @@
1
+ import { memo } from 'react';
2
+
3
+ import RawConversation from '@/features/Conversation';
4
+
5
+ import ChatInput from './ChatInput';
6
+ import HotKeys from './HotKeys';
7
+
8
+ const Conversation = memo(() => {
9
+ return (
10
+ <>
11
+ <RawConversation chatInput={<ChatInput />} />
12
+ <HotKeys />
13
+ </>
14
+ );
15
+ });
16
+
17
+ export default Conversation;
@@ -0,0 +1,44 @@
1
+ import isEqual from 'fast-deep-equal';
2
+ import { useCallback } from 'react';
3
+ import { useHotkeys } from 'react-hotkeys-hook';
4
+
5
+ import { CLEAN_MESSAGE_KEY, META_KEY, PREFIX_KEY, REGENERATE_KEY } from '@/const/hotkeys';
6
+ import { useChatStore } from '@/store/chat';
7
+ import { chatSelectors } from '@/store/chat/selectors';
8
+ import { useFileStore } from '@/store/file';
9
+
10
+ const HotKeys = () => {
11
+ const resendHotkeys = [PREFIX_KEY, REGENERATE_KEY].join('+');
12
+
13
+ const [resendMessage, clearMessage] = useChatStore((s) => [s.resendMessage, s.clearMessage]);
14
+ const lastMessage = useChatStore(chatSelectors.latestMessage, isEqual);
15
+
16
+ const [clearImageList] = useFileStore((s) => [s.clearImageList]);
17
+ const clearHotkeys = [META_KEY, PREFIX_KEY, CLEAN_MESSAGE_KEY].join('+');
18
+
19
+ const resetConversation = useCallback(() => {
20
+ clearMessage();
21
+ clearImageList();
22
+ }, []);
23
+
24
+ useHotkeys(clearHotkeys, resetConversation, {
25
+ enableOnFormTags: true,
26
+ preventDefault: true,
27
+ });
28
+
29
+ useHotkeys(
30
+ resendHotkeys,
31
+ () => {
32
+ if (!lastMessage || lastMessage.id === 'default' || lastMessage.role === 'system') return;
33
+ resendMessage(lastMessage.id);
34
+ },
35
+ {
36
+ enableOnFormTags: true,
37
+ preventDefault: true,
38
+ },
39
+ );
40
+
41
+ return null;
42
+ };
43
+
44
+ export default HotKeys;
@@ -5,11 +5,10 @@ import { FC, memo } from 'react';
5
5
  import { Flexbox } from 'react-layout-kit';
6
6
 
7
7
  import ResponsiveIndex from '@/components/ResponsiveIndex';
8
- import Conversation from '@/features/Conversation';
9
8
 
10
9
  import PageTitle from '../features/PageTitle';
11
10
  import ChatHeader from './features/ChatHeader';
12
- import ChatInput from './features/ChatInput';
11
+ import Conversation from './features/Conversation';
13
12
  import SideBar from './features/SideBar';
14
13
  import Layout from './layout.desktop';
15
14
 
@@ -21,7 +20,7 @@ const DesktopPage = memo(() => (
21
20
  <PageTitle />
22
21
  <ChatHeader />
23
22
  <Flexbox flex={1} height={'calc(100% - 64px)'} horizontal>
24
- <Conversation chatInput={<ChatInput />} />
23
+ <Conversation />
25
24
  <SideBar />
26
25
  </Flexbox>
27
26
  </Layout>
@@ -5,7 +5,7 @@ import { useTranslation } from 'react-i18next';
5
5
  import { Flexbox } from 'react-layout-kit';
6
6
 
7
7
  import pkg from '@/../package.json';
8
- import ChatList from '@/features/Conversation/container';
8
+ import ChatList from '@/features/Conversation/components/ChatList';
9
9
  import { useSessionStore } from '@/store/session';
10
10
  import { agentSelectors, sessionSelectors } from '@/store/session/selectors';
11
11
 
@@ -1,7 +1,7 @@
1
1
  import { ActionIcon, Icon } from '@lobehub/ui';
2
2
  import { App, Dropdown, type MenuProps } from 'antd';
3
3
  import { createStyles } from 'antd-style';
4
- import { HardDriveDownload, MoreVertical, Pin, PinOff, Trash } from 'lucide-react';
4
+ import { HardDriveDownload, LucideCopy, MoreVertical, Pin, PinOff, Trash } from 'lucide-react';
5
5
  import { memo, useMemo } from 'react';
6
6
  import { useTranslation } from 'react-i18next';
7
7
 
@@ -26,9 +26,14 @@ const Actions = memo<ActionProps>(({ id, setOpen }) => {
26
26
 
27
27
  const { styles } = useStyles();
28
28
 
29
- const [pin, removeSession, pinSession] = useSessionStore((s) => {
29
+ const [pin, removeSession, pinSession, duplicateSession] = useSessionStore((s) => {
30
30
  const session = sessionSelectors.getSessionById(id)(s);
31
- return [sessionHelpers.getSessionPinned(session), s.removeSession, s.pinSession];
31
+ return [
32
+ sessionHelpers.getSessionPinned(session),
33
+ s.removeSession,
34
+ s.pinSession,
35
+ s.duplicateSession,
36
+ ];
32
37
  });
33
38
 
34
39
  const { modal } = App.useApp();
@@ -64,6 +69,22 @@ const Actions = memo<ActionProps>(({ id, setOpen }) => {
64
69
  key: 'export',
65
70
  label: t('export'),
66
71
  },
72
+ {
73
+ type: 'divider',
74
+ },
75
+ {
76
+ icon: <Icon icon={LucideCopy} />,
77
+ key: 'duplicate',
78
+ label: t('duplicate'),
79
+ onClick: ({ domEvent }) => {
80
+ domEvent.stopPropagation();
81
+
82
+ duplicateSession(id);
83
+ },
84
+ },
85
+ {
86
+ type: 'divider',
87
+ },
67
88
  {
68
89
  danger: true,
69
90
  icon: <Icon icon={Trash} />,
@@ -1,7 +1,7 @@
1
1
  import { ActionIcon, EditableText, Icon } from '@lobehub/ui';
2
2
  import { App, Dropdown, type MenuProps, Typography } from 'antd';
3
3
  import { createStyles } from 'antd-style';
4
- import { MoreVertical, PencilLine, Star, Trash } from 'lucide-react';
4
+ import { LucideCopy, MoreVertical, PencilLine, Star, Trash, Wand2 } from 'lucide-react';
5
5
  import { memo, useMemo } from 'react';
6
6
  import { useTranslation } from 'react-i18next';
7
7
  import { Flexbox } from 'react-layout-kit';
@@ -33,11 +33,22 @@ interface TopicContentProps {
33
33
  const TopicContent = memo<TopicContentProps>(({ id, title, fav, showMore }) => {
34
34
  const { t } = useTranslation('common');
35
35
 
36
- const [editing, favoriteTopic, updateTopicTitle, removeTopic] = useChatStore((s) => [
36
+ const [
37
+ editing,
38
+ favoriteTopic,
39
+ updateTopicTitle,
40
+ removeTopic,
41
+ autoRenameTopicTitle,
42
+ duplicateTopic,
43
+ // sessionId,
44
+ ] = useChatStore((s) => [
37
45
  s.topicRenamingId === id,
38
46
  s.favoriteTopic,
39
47
  s.updateTopicTitle,
40
48
  s.removeTopic,
49
+ s.autoRenameTopicTitle,
50
+ s.duplicateTopic,
51
+ s.activeId,
41
52
  ]);
42
53
  const { styles, theme } = useStyles();
43
54
 
@@ -49,6 +60,14 @@ const TopicContent = memo<TopicContentProps>(({ id, title, fav, showMore }) => {
49
60
 
50
61
  const items = useMemo<MenuProps['items']>(
51
62
  () => [
63
+ {
64
+ icon: <Icon icon={Wand2} />,
65
+ key: 'autoRename',
66
+ label: t('topic.actions.autoRename', { ns: 'chat' }),
67
+ onClick: () => {
68
+ autoRenameTopicTitle(id);
69
+ },
70
+ },
52
71
  {
53
72
  icon: <Icon icon={PencilLine} />,
54
73
  key: 'rename',
@@ -57,6 +76,28 @@ const TopicContent = memo<TopicContentProps>(({ id, title, fav, showMore }) => {
57
76
  toggleEditing(true);
58
77
  },
59
78
  },
79
+ {
80
+ type: 'divider',
81
+ },
82
+ {
83
+ icon: <Icon icon={LucideCopy} />,
84
+ key: 'duplicate',
85
+ label: t('topic.actions.duplicate', { ns: 'chat' }),
86
+ onClick: () => {
87
+ duplicateTopic(id);
88
+ },
89
+ },
90
+ // {
91
+ // icon: <Icon icon={LucideDownload} />,
92
+ // key: 'export',
93
+ // label: t('topic.actions.export', { ns: 'chat' }),
94
+ // onClick: () => {
95
+ // configService.exportSingleTopic(sessionId, id);
96
+ // },
97
+ // },
98
+ {
99
+ type: 'divider',
100
+ },
60
101
  // {
61
102
  // icon: <Icon icon={Share2} />,
62
103
  // key: 'share',