@lobehub/chat 0.73.0 → 0.75.0
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/.github/workflows/contributor-help.yml +1 -1
- package/.github/workflows/sync.yml +43 -0
- package/.github/workflows/wiki-sync.yml +1 -0
- package/CHANGELOG.md +87 -0
- package/README.md +40 -6
- package/{README-zh_CN.md → README.zh-CN.md} +38 -4
- package/docs/Home.md +6 -0
- package/docs/Upstream-Sync.en-US.md +16 -0
- package/docs/Upstream-Sync.zh-CN.md +16 -0
- package/docs/_Sidebar.md +6 -0
- package/locales/en_US/market.json +12 -0
- package/locales/en_US/plugin.json +11 -2
- package/locales/en_US/setting.json +63 -2
- package/locales/ru_RU/market.json +12 -0
- package/locales/ru_RU/plugin.json +44 -49
- package/locales/ru_RU/setting.json +63 -2
- package/locales/zh_CN/common.json +1 -1
- package/locales/zh_CN/market.json +12 -0
- package/locales/zh_CN/plugin.json +19 -5
- package/locales/zh_CN/setting.json +62 -14
- package/package.json +5 -4
- package/scripts/i18nWorkflow/const.ts +19 -0
- package/scripts/i18nWorkflow/genDefaultLocale.ts +19 -0
- package/scripts/i18nWorkflow/genDiff.ts +50 -0
- package/scripts/i18nWorkflow/genResources.ts +26 -0
- package/scripts/i18nWorkflow/index.ts +15 -0
- package/scripts/i18nWorkflow/utils.ts +85 -0
- package/src/const/layoutTokens.ts +3 -1
- package/src/const/market.ts +15 -0
- package/src/const/url.ts +29 -4
- package/src/features/AgentSetting/AgentConfig/index.tsx +1 -2
- package/src/features/AgentSetting/AgentPlugin/MarketSettingModal.tsx +1 -1
- package/src/features/AgentSetting/store/initialState.ts +1 -1
- package/src/features/MobileTabBar/index.tsx +2 -2
- package/src/features/SideBar/TopActions.tsx +2 -2
- package/src/locales/default/market.ts +12 -0
- package/src/locales/resources/en_US.ts +2 -0
- package/src/locales/resources/ru_RU.ts +2 -0
- package/src/locales/resources/zh_CN.ts +2 -0
- package/src/pages/chat/features/Conversation/Input/{Action.tsx → ActionBar/ActionLeft.tsx} +2 -2
- package/src/pages/chat/features/Conversation/Input/ActionBar/ActionRight.tsx +36 -0
- package/src/pages/chat/features/Conversation/Input/Desktop.tsx +40 -0
- package/src/pages/chat/features/Conversation/Input/Footer/SaveTopic.tsx +27 -0
- package/src/pages/chat/features/Conversation/Input/Footer/index.tsx +35 -0
- package/src/pages/chat/features/Conversation/Input/Mobile.tsx +12 -0
- package/src/pages/chat/features/Conversation/Input/index.tsx +20 -38
- package/src/pages/chat/features/SessionList/Header/Desktop.tsx +6 -13
- package/src/pages/chat/features/SessionList/Header/Mobile.tsx +1 -1
- package/src/pages/chat/features/SessionList/List/AddButton.tsx +1 -1
- package/src/pages/chat/features/SessionList/List/Item/index.tsx +4 -3
- package/src/pages/chat/features/SessionList/List/index.tsx +1 -3
- package/src/pages/chat/features/SessionList/Mobile.tsx +2 -12
- package/src/pages/chat/features/SessionSearchBar/index.tsx +26 -0
- package/src/pages/chat/features/Sidebar/Topic/index.tsx +18 -6
- package/src/pages/chat/features/Sidebar/TopicSearchBar/index.tsx +24 -0
- package/src/pages/chat/features/Sidebar/index.tsx +2 -9
- package/src/pages/market/features/AgentCard/AgentCardBanner.tsx +64 -0
- package/src/pages/market/features/AgentCard/AgentCardItem.tsx +57 -0
- package/src/pages/market/features/AgentCard/Loading.tsx +13 -0
- package/src/pages/market/features/AgentCard/index.tsx +37 -0
- package/src/pages/market/features/AgentCard/style.ts +22 -0
- package/src/pages/market/features/AgentSearchBar/index.tsx +26 -0
- package/src/pages/market/features/Header/Desktop.tsx +15 -4
- package/src/pages/market/features/Header/Mobile.tsx +7 -24
- package/src/pages/market/features/SideBar/AgentInfo/Comment.tsx +16 -0
- package/src/pages/market/features/SideBar/AgentInfo/Header.tsx +68 -0
- package/src/pages/market/features/SideBar/AgentInfo/Loading.tsx +61 -0
- package/src/pages/market/features/SideBar/AgentInfo/TokenTag.tsx +25 -0
- package/src/pages/market/features/SideBar/AgentInfo/index.tsx +68 -0
- package/src/pages/market/features/SideBar/AgentInfo/style.ts +46 -0
- package/src/pages/market/features/SideBar/Desktop.tsx +70 -0
- package/src/pages/market/features/SideBar/Mobile.tsx +36 -0
- package/src/pages/market/features/SideBar/index.tsx +23 -0
- package/src/pages/market/features/TagList/index.tsx +29 -0
- package/src/pages/market/index.page.tsx +11 -2
- package/src/pages/market/layout.mobile.tsx +8 -7
- package/src/pages/market/layout.tsx +39 -1
- package/src/pages/settings/features/Header/Desktop.tsx +2 -4
- package/src/pages/settings/features/Header/Mobile.tsx +1 -1
- package/src/pages/settings/features/Settings/Common.tsx +1 -2
- package/src/pages/settings/features/Settings/index.tsx +17 -4
- package/src/services/agentMarket.ts +21 -0
- package/src/store/global/initialState.ts +1 -2
- package/src/store/market/action.ts +57 -0
- package/src/store/market/index.ts +3 -0
- package/src/store/market/initialState.ts +17 -0
- package/src/store/market/selectors.ts +36 -0
- package/src/store/market/store.ts +51 -0
- package/src/store/session/slices/session/action.ts +5 -3
- package/src/store/session/slices/session/initialState.ts +2 -0
- package/src/store/session/slices/session/reducers/session.test.ts +4 -4
- package/src/types/market.ts +19 -0
- package/src/types/meta.ts +1 -1
- package/src/utils/filter.ts +1 -1
- package/src/utils/findDuplicates.ts +22 -0
- package/scripts/genDefaultLocale.ts +0 -18
- package/scripts/genResources.ts +0 -51
- package/scripts/toc.ts +0 -7
- package/src/components/Empty/index.tsx +0 -63
- package/src/components/Empty/style.ts +0 -31
- package/src/components/SelectWithImg/index.tsx +0 -97
- package/src/components/SelectWithImg/styles.ts +0 -43
- package/src/pages/chat/features/Conversation/Input/ActionRight.tsx +0 -31
- package/src/pages/chat/features/Conversation/Input/Footer.tsx +0 -49
- /package/src/components/{ManifestPreviewer.tsx → ManifestPreviewer/index.tsx} +0 -0
- /package/src/pages/chat/features/Conversation/Input/{Token.tsx → ActionBar/Token.tsx} +0 -0
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"debug": {
|
|
3
|
-
"arguments": "Аргументы",
|
|
3
|
+
"arguments": "Аргументы вызова",
|
|
4
4
|
"function_call": "Вызов функции",
|
|
5
5
|
"response": "Ответ"
|
|
6
6
|
},
|
|
7
7
|
"dev": {
|
|
8
|
-
"confirmDeleteDevPlugin": "Вы
|
|
8
|
+
"confirmDeleteDevPlugin": "Вы собираетесь удалить этот локальный плагин. После удаления его будет невозможно восстановить. Вы уверены, что хотите удалить этот плагин?",
|
|
9
9
|
"deleteSuccess": "Плагин успешно удален",
|
|
10
10
|
"manifest": {
|
|
11
11
|
"identifier": {
|
|
@@ -13,14 +13,14 @@
|
|
|
13
13
|
"label": "Идентификатор"
|
|
14
14
|
},
|
|
15
15
|
"mode": {
|
|
16
|
-
"local": "Визуальная
|
|
17
|
-
"local-tooltip": "Визуальная
|
|
16
|
+
"local": "Визуальная настройка",
|
|
17
|
+
"local-tooltip": "Визуальная настройка временно недоступна",
|
|
18
18
|
"url": "Онлайн-ссылка"
|
|
19
19
|
},
|
|
20
20
|
"name": {
|
|
21
|
-
"desc": "
|
|
22
|
-
"label": "
|
|
23
|
-
"placeholder": "
|
|
21
|
+
"desc": "Заголовок плагина",
|
|
22
|
+
"label": "Заголовок",
|
|
23
|
+
"placeholder": "Поиск в поисковой системе"
|
|
24
24
|
}
|
|
25
25
|
},
|
|
26
26
|
"meta": {
|
|
@@ -29,83 +29,78 @@
|
|
|
29
29
|
"label": "Автор"
|
|
30
30
|
},
|
|
31
31
|
"avatar": {
|
|
32
|
-
"desc": "Иконка плагина,
|
|
32
|
+
"desc": "Иконка плагина, можно использовать Emoji или URL",
|
|
33
33
|
"label": "Иконка"
|
|
34
34
|
},
|
|
35
35
|
"description": {
|
|
36
36
|
"desc": "Описание плагина",
|
|
37
37
|
"label": "Описание",
|
|
38
|
-
"placeholder": "Получение информации из
|
|
38
|
+
"placeholder": "Получение информации из поисковой системы"
|
|
39
39
|
},
|
|
40
|
-
"formFieldRequired": "Это поле
|
|
40
|
+
"formFieldRequired": "Это обязательное поле",
|
|
41
41
|
"homepage": {
|
|
42
42
|
"desc": "Домашняя страница плагина",
|
|
43
|
-
"label": "
|
|
43
|
+
"label": "Домашняя страница"
|
|
44
44
|
},
|
|
45
45
|
"identifier": {
|
|
46
|
-
"desc": "Уникальный идентификатор плагина,
|
|
47
|
-
"errorDuplicate": "Идентификатор уже используется другим
|
|
46
|
+
"desc": "Уникальный идентификатор плагина, будет автоматически определен из манифеста",
|
|
47
|
+
"errorDuplicate": "Идентификатор уже используется другим плагином. Пожалуйста, измените идентификатор",
|
|
48
48
|
"label": "Идентификатор",
|
|
49
|
-
"pattenErrorMessage": "
|
|
49
|
+
"pattenErrorMessage": "Можно вводить только латинские буквы, цифры, - и _"
|
|
50
50
|
},
|
|
51
51
|
"manifest": {
|
|
52
|
-
"desc": "LobeChat
|
|
53
|
-
"
|
|
54
|
-
"label": "URL-адрес
|
|
55
|
-
"
|
|
52
|
+
"desc": "LobeChat будет устанавливать плагин по этой ссылке",
|
|
53
|
+
"jsonInvalid": "Манифест не соответствует стандарту. Результат проверки: \n\n {{error}}",
|
|
54
|
+
"label": "URL-адрес описания плагина",
|
|
55
|
+
"preview": "Предварительный просмотр манифеста",
|
|
56
|
+
"refresh": "Обновить",
|
|
57
|
+
"requestError": "Не удалось получить данные по этой ссылке. Пожалуйста, введите действительную ссылку и проверьте, разрешен ли кросс-доменный доступ",
|
|
58
|
+
"urlError": "Ссылка не возвращает данные в формате JSON. Пожалуйста, введите действительную ссылку"
|
|
56
59
|
},
|
|
57
60
|
"title": {
|
|
58
|
-
"desc": "
|
|
59
|
-
"label": "
|
|
60
|
-
"placeholder": "
|
|
61
|
+
"desc": "Заголовок плагина",
|
|
62
|
+
"label": "Заголовок",
|
|
63
|
+
"placeholder": "Поиск в поисковой системе"
|
|
61
64
|
}
|
|
62
65
|
},
|
|
63
|
-
"metaConfig": "
|
|
64
|
-
"modalDesc": "После добавления пользовательского плагина его можно использовать для проверки разработки
|
|
66
|
+
"metaConfig": "Настройка метаданных плагина",
|
|
67
|
+
"modalDesc": "После добавления пользовательского плагина его можно использовать для проверки разработки плагинов или непосредственно в сеансе. См. документацию по разработке плагинов",
|
|
65
68
|
"preview": {
|
|
66
|
-
"card": "Предварительный просмотр
|
|
69
|
+
"card": "Предварительный просмотр плагина",
|
|
67
70
|
"desc": "Предварительный просмотр описания плагина",
|
|
68
71
|
"title": "Предварительный просмотр имени плагина"
|
|
69
72
|
},
|
|
70
73
|
"save": "Сохранить",
|
|
71
74
|
"saveSuccess": "Настройки плагина успешно сохранены",
|
|
72
75
|
"tabs": {
|
|
73
|
-
"manifest": "Описание
|
|
76
|
+
"manifest": "Описание функций (Манифест)",
|
|
74
77
|
"meta": "Метаданные плагина"
|
|
75
78
|
},
|
|
76
|
-
"title": "Добавить пользовательский плагин"
|
|
79
|
+
"title": "Добавить пользовательский плагин",
|
|
80
|
+
"update": "Обновить",
|
|
81
|
+
"updateSuccess": "Настройки плагина успешно обновлены"
|
|
77
82
|
},
|
|
78
83
|
"list": {
|
|
79
84
|
"item": {
|
|
80
|
-
"
|
|
81
|
-
"local.
|
|
85
|
+
"deprecated.title": "Удалено",
|
|
86
|
+
"local.config": "Настройка",
|
|
87
|
+
"local.title": "Пользовательский"
|
|
82
88
|
}
|
|
83
89
|
},
|
|
84
90
|
"loading": {
|
|
85
|
-
"content": "
|
|
86
|
-
"plugin": "
|
|
91
|
+
"content": "Получение данных...",
|
|
92
|
+
"plugin": "Выполнение плагина..."
|
|
87
93
|
},
|
|
88
94
|
"pluginList": "Список плагинов",
|
|
89
95
|
"plugins": {
|
|
90
|
-
"
|
|
91
|
-
"searchEngine": "Поисковая система",
|
|
92
|
-
"undefined": "Обнаружение плагина...",
|
|
93
|
-
"websiteCrawler": "Website Crawler",
|
|
94
|
-
"неизвестно": "Идет обнаружение плагина..."
|
|
96
|
+
"unknown": "Проверка плагинов..."
|
|
95
97
|
},
|
|
96
|
-
"
|
|
97
|
-
"
|
|
98
|
-
"
|
|
99
|
-
"
|
|
100
|
-
"dayweather": "Погода в дневное время",
|
|
101
|
-
"Дневной ветер": "Дневной ветер",
|
|
102
|
-
"nighttemp_float": "Температура в ночное время",
|
|
103
|
-
"nightweather": "Погода в ночное время",
|
|
104
|
-
"ночной ветер": "Ночной ветер",
|
|
105
|
-
"week": "Неделя"
|
|
98
|
+
"settings": {
|
|
99
|
+
"indexUrl": {
|
|
100
|
+
"title": "Индекс рынка",
|
|
101
|
+
"tooltip": "Редактирование в настоящее время недоступно"
|
|
106
102
|
},
|
|
107
|
-
"
|
|
108
|
-
"
|
|
109
|
-
}
|
|
110
|
-
"responseData": "Ответные данные"
|
|
103
|
+
"modalDesc": "После настройки адреса рынка плагинов можно использовать пользовательский рынок плагинов",
|
|
104
|
+
"title": "Настройки рынка плагинов"
|
|
105
|
+
}
|
|
111
106
|
}
|
|
@@ -20,6 +20,64 @@
|
|
|
20
20
|
"session": "Настройки сессии",
|
|
21
21
|
"sessionWithName": "Настройки сессии · {{name}}"
|
|
22
22
|
},
|
|
23
|
+
"llm": {
|
|
24
|
+
"AzureOpenAI": {
|
|
25
|
+
"endpoint": {
|
|
26
|
+
"desc": "Это значение можно найти в разделе «Ключи и конечные точки» при проверке ресурса на сайте Azure.",
|
|
27
|
+
"placeholder": "https://docs-test-001.openai.azure.com",
|
|
28
|
+
"title": "Адрес API Azure"
|
|
29
|
+
},
|
|
30
|
+
"models": {
|
|
31
|
+
"desc": "Поддерживаемые модели",
|
|
32
|
+
"title": "Список моделей"
|
|
33
|
+
},
|
|
34
|
+
"title": "Настройки Azure OpenAI",
|
|
35
|
+
"token": {
|
|
36
|
+
"desc": "Это значение можно найти в разделе «Ключи и конечные точки» при проверке ресурса на сайте Azure. Можно использовать KEY1 или KEY2",
|
|
37
|
+
"placeholder": "Azure Ключ API",
|
|
38
|
+
"title": "Ключ API"
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
"OpenAI": {
|
|
42
|
+
"azureApiVersion": {
|
|
43
|
+
"desc": "Версия API Azure в формате ГГГГ-ММ-ДД, проверьте [последнюю версию](https://learn.microsoft.com/zh-cn/azure/ai-services/openai/reference#chat-completions)",
|
|
44
|
+
"fetch": "Получить список",
|
|
45
|
+
"title": "Версия Azure Api"
|
|
46
|
+
},
|
|
47
|
+
"check": {
|
|
48
|
+
"button": "Проверить",
|
|
49
|
+
"desc": "Проверьте правильность заполнения Api Key и адреса прокси-сервера.",
|
|
50
|
+
"pass": "Подключение успешно",
|
|
51
|
+
"title": "Проверка возможности подключения"
|
|
52
|
+
},
|
|
53
|
+
"endpoint": {
|
|
54
|
+
"desc": "Должен содержать http(s):// в дополнение к адресу по умолчанию.",
|
|
55
|
+
"placeholder": "https://api.openai.com/v1",
|
|
56
|
+
"title": "адрес API прокси"
|
|
57
|
+
},
|
|
58
|
+
"models": {
|
|
59
|
+
"count": "Всего поддерживается {{count}} моделей",
|
|
60
|
+
"desc": "Поддерживаемые модели",
|
|
61
|
+
"fetch": "Получение списка моделей",
|
|
62
|
+
"notSupport": "Azure OpenAI в настоящее время не поддерживает просмотр списков моделей",
|
|
63
|
+
"notSupportTip": "Необходимо убедиться в том, что имя развертывания совпадает с именем модели",
|
|
64
|
+
"refetch": "Получение списка моделей",
|
|
65
|
+
"title": "Список моделей"
|
|
66
|
+
},
|
|
67
|
+
"title": "Настройки OpenAI",
|
|
68
|
+
"token": {
|
|
69
|
+
"desc": "Используйте свой собственный ключ OpenAI",
|
|
70
|
+
"placeholder": "Ключ API OpenAI",
|
|
71
|
+
"title": "Ключ API"
|
|
72
|
+
},
|
|
73
|
+
"useAzure": {
|
|
74
|
+
"desc": "Использование служб OpenAI из Azure",
|
|
75
|
+
"fetch": "Получить список",
|
|
76
|
+
"title": "Azure OpenAI"
|
|
77
|
+
}
|
|
78
|
+
},
|
|
79
|
+
"waitingForMore": "<1>Планируется доступ к другим моделям</1>, так что следите за обновлениями ✨"
|
|
80
|
+
},
|
|
23
81
|
"settingAgent": {
|
|
24
82
|
"avatar": {
|
|
25
83
|
"title": "Аватар"
|
|
@@ -131,7 +189,9 @@
|
|
|
131
189
|
"title": "Список плагинов",
|
|
132
190
|
"add": "Добавить",
|
|
133
191
|
"addTooltip": "Добавить кастомный плагин",
|
|
134
|
-
"config": "{{id}} Конфигурация плагина"
|
|
192
|
+
"config": "{{id}} Конфигурация плагина",
|
|
193
|
+
"clearDeprecated": "Удалить недействительные плагины",
|
|
194
|
+
"settings": "Настройки плагинов"
|
|
135
195
|
},
|
|
136
196
|
"settingSystem": {
|
|
137
197
|
"accessCode": {
|
|
@@ -170,6 +230,7 @@
|
|
|
170
230
|
},
|
|
171
231
|
"tab": {
|
|
172
232
|
"agent": "Помощник по умолчанию",
|
|
173
|
-
"common": "Общие настройки"
|
|
233
|
+
"common": "Общие настройки",
|
|
234
|
+
"llm": "Пользовательский API GPT"
|
|
174
235
|
}
|
|
175
236
|
}
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
"import": "导入配置",
|
|
37
37
|
"inbox": {
|
|
38
38
|
"defaultMessage": "你好,我是你的智能助手,你可以问我任何问题,我会尽力回答你。如果需要获得更加专业或定制的助手,可以点击<kbd>+</kbd>创建自定义助手",
|
|
39
|
-
"desc": "
|
|
39
|
+
"desc": "开启大脑集群,激发思维火花。你的智能助理,在这里与你交流一切",
|
|
40
40
|
"title": "随便聊聊"
|
|
41
41
|
},
|
|
42
42
|
"message": {
|
|
@@ -43,16 +43,19 @@
|
|
|
43
43
|
"label": "首页"
|
|
44
44
|
},
|
|
45
45
|
"identifier": {
|
|
46
|
-
"desc": "
|
|
46
|
+
"desc": "插件的唯一标识,将从 manifest 中自动识别",
|
|
47
47
|
"errorDuplicate": "标识符和已有插件重复,请修改标识符",
|
|
48
48
|
"label": "标识符",
|
|
49
49
|
"pattenErrorMessage": "只能输入英文字符、数字 、- 和_ 这两个符号"
|
|
50
50
|
},
|
|
51
51
|
"manifest": {
|
|
52
52
|
"desc": "LobeChat 将会通过该链接安装插件",
|
|
53
|
-
"
|
|
53
|
+
"jsonInvalid": " manifest 不符合规范,校验结果: \n\n {{error}}",
|
|
54
54
|
"label": "插件描述文件 Url 地址",
|
|
55
|
-
"
|
|
55
|
+
"preview": "预览 Manifest",
|
|
56
|
+
"refresh": "刷新",
|
|
57
|
+
"requestError": "请求该链接失败,请输入一个有效的链接,并检查链接是否允许跨域访问",
|
|
58
|
+
"urlError": "该链接没有返回 JSON 格式的内容, 请输入一个有效的链接"
|
|
56
59
|
},
|
|
57
60
|
"title": {
|
|
58
61
|
"desc": "插件标题",
|
|
@@ -73,12 +76,15 @@
|
|
|
73
76
|
"manifest": "功能描述清单 (Manifest)",
|
|
74
77
|
"meta": "插件元信息"
|
|
75
78
|
},
|
|
76
|
-
"title": "添加自定义插件"
|
|
79
|
+
"title": "添加自定义插件",
|
|
80
|
+
"update": "更新",
|
|
81
|
+
"updateSuccess": "插件设置更新成功"
|
|
77
82
|
},
|
|
78
83
|
"list": {
|
|
79
84
|
"item": {
|
|
85
|
+
"deprecated.title": "已删除",
|
|
80
86
|
"local.config": "配置",
|
|
81
|
-
"local.title": "
|
|
87
|
+
"local.title": "自定义"
|
|
82
88
|
}
|
|
83
89
|
},
|
|
84
90
|
"loading": {
|
|
@@ -88,5 +94,13 @@
|
|
|
88
94
|
"pluginList": "插件列表",
|
|
89
95
|
"plugins": {
|
|
90
96
|
"unknown": "插件检测中..."
|
|
97
|
+
},
|
|
98
|
+
"settings": {
|
|
99
|
+
"indexUrl": {
|
|
100
|
+
"title": "市场索引",
|
|
101
|
+
"tooltip": "暂不支持编辑"
|
|
102
|
+
},
|
|
103
|
+
"modalDesc": "配置插件市场的地址后,可以使用自定义的插件市场",
|
|
104
|
+
"title": "设置插件市场"
|
|
91
105
|
}
|
|
92
106
|
}
|
|
@@ -20,6 +20,64 @@
|
|
|
20
20
|
"session": "会话设置",
|
|
21
21
|
"sessionWithName": "会话设置 · {{name}}"
|
|
22
22
|
},
|
|
23
|
+
"llm": {
|
|
24
|
+
"AzureOpenAI": {
|
|
25
|
+
"endpoint": {
|
|
26
|
+
"desc": "从 Azure 门户检查资源时,可在“密钥和终结点”部分中找到此值",
|
|
27
|
+
"placeholder": "https://docs-test-001.openai.azure.com",
|
|
28
|
+
"title": "Azure API 地址"
|
|
29
|
+
},
|
|
30
|
+
"models": {
|
|
31
|
+
"desc": "支持的模型",
|
|
32
|
+
"title": "模型列表"
|
|
33
|
+
},
|
|
34
|
+
"title": "Azure OpenAI 设置",
|
|
35
|
+
"token": {
|
|
36
|
+
"desc": "从 Azure 门户检查资源时,可在“密钥和终结点”部分中找到此值。 可以使用 KEY1 或 KEY2",
|
|
37
|
+
"placeholder": "Azure API Key",
|
|
38
|
+
"title": "API Key"
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
"OpenAI": {
|
|
42
|
+
"azureApiVersion": {
|
|
43
|
+
"desc": "Azure 的 API 版本,遵循 YYYY-MM-DD 格式,查阅[最新版本](https://learn.microsoft.com/zh-cn/azure/ai-services/openai/reference#chat-completions)",
|
|
44
|
+
"fetch": "获取列表",
|
|
45
|
+
"title": "Azure Api Version"
|
|
46
|
+
},
|
|
47
|
+
"check": {
|
|
48
|
+
"button": "检查",
|
|
49
|
+
"desc": "测试 Api Key 与代理地址是否正确填写",
|
|
50
|
+
"pass": "检查通过",
|
|
51
|
+
"title": "连通性检查"
|
|
52
|
+
},
|
|
53
|
+
"endpoint": {
|
|
54
|
+
"desc": "除默认地址外,必须包含 http(s)://",
|
|
55
|
+
"placeholder": "https://api.openai.com/v1",
|
|
56
|
+
"title": "接口代理地址"
|
|
57
|
+
},
|
|
58
|
+
"models": {
|
|
59
|
+
"count": "共支持 {{count}} 个模型",
|
|
60
|
+
"desc": "支持的模型",
|
|
61
|
+
"fetch": "获取模型列表",
|
|
62
|
+
"notSupport": "Azure OpenAI 暂不支持查看模型列表",
|
|
63
|
+
"notSupportTip": "你需要自行确保部署名称与模型名称一致",
|
|
64
|
+
"refetch": "重新获取模型列表",
|
|
65
|
+
"title": "模型列表"
|
|
66
|
+
},
|
|
67
|
+
"title": "OpenAI 设置",
|
|
68
|
+
"token": {
|
|
69
|
+
"desc": "使用自己的 OpenAI Key",
|
|
70
|
+
"placeholder": "OpenAI API Key",
|
|
71
|
+
"title": "API Key"
|
|
72
|
+
},
|
|
73
|
+
"useAzure": {
|
|
74
|
+
"desc": "使用 Azure 提供的 OpenAI 服务",
|
|
75
|
+
"fetch": "获取列表",
|
|
76
|
+
"title": "Azure OpenAI"
|
|
77
|
+
}
|
|
78
|
+
},
|
|
79
|
+
"waitingForMore": "更多模型正在 <1>计划接入</1> 中,敬请期待 ✨"
|
|
80
|
+
},
|
|
23
81
|
"settingAgent": {
|
|
24
82
|
"avatar": {
|
|
25
83
|
"title": "头像"
|
|
@@ -114,23 +172,12 @@
|
|
|
114
172
|
"title": "核采样"
|
|
115
173
|
}
|
|
116
174
|
},
|
|
117
|
-
"settingOpenAI": {
|
|
118
|
-
"endpoint": {
|
|
119
|
-
"desc": "除默认地址外,必须包含 http(s)://",
|
|
120
|
-
"placeholder": "https://api.openai.com/v1",
|
|
121
|
-
"title": "接口代理地址"
|
|
122
|
-
},
|
|
123
|
-
"title": "OpenAI 设置",
|
|
124
|
-
"token": {
|
|
125
|
-
"desc": "使用自己的 OpenAI Key",
|
|
126
|
-
"placeholder": "OpenAI API Key",
|
|
127
|
-
"title": "API Key"
|
|
128
|
-
}
|
|
129
|
-
},
|
|
130
175
|
"settingPlugin": {
|
|
131
176
|
"add": "添加",
|
|
132
177
|
"addTooltip": "添加自定义插件",
|
|
178
|
+
"clearDeprecated": "移除无效插件",
|
|
133
179
|
"config": "{{id}} 插件配置",
|
|
180
|
+
"settings": "配置插件市场",
|
|
134
181
|
"title": "插件列表"
|
|
135
182
|
},
|
|
136
183
|
"settingSystem": {
|
|
@@ -170,6 +217,7 @@
|
|
|
170
217
|
},
|
|
171
218
|
"tab": {
|
|
172
219
|
"agent": "默认助手",
|
|
173
|
-
"common": "通用设置"
|
|
220
|
+
"common": "通用设置",
|
|
221
|
+
"llm": "语言模型"
|
|
174
222
|
}
|
|
175
223
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lobehub/chat",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.75.0",
|
|
4
4
|
"description": "Lobe Chat is an open-source chatbot client using Vercel AI SDK, Typescript and Next.js",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"chatbot",
|
|
@@ -25,8 +25,8 @@
|
|
|
25
25
|
"scripts": {
|
|
26
26
|
"build": "next build",
|
|
27
27
|
"dev": "next dev -p 3010",
|
|
28
|
-
"i18n": "npm run i18n:
|
|
29
|
-
"i18n:
|
|
28
|
+
"i18n": "npm run i18n:workflow && lobe-i18n",
|
|
29
|
+
"i18n:workflow": "ts-node --project ./tsconfig.json scripts/i18nWorkflow/index.ts",
|
|
30
30
|
"lint": "npm run lint:ts && npm run lint:style && npm run type-check && npm run lint:circular",
|
|
31
31
|
"lint:circular": "dpdm src/**/*.ts --warning false --tree false --exit-code circular:1 -T true",
|
|
32
32
|
"lint:md": "remark . --quiet --frail --output",
|
|
@@ -89,7 +89,7 @@
|
|
|
89
89
|
"lucide-react": "latest",
|
|
90
90
|
"nanoid": "^4",
|
|
91
91
|
"next": "13.4.7",
|
|
92
|
-
"openai": "^4.
|
|
92
|
+
"openai": "^4.6.0",
|
|
93
93
|
"polished": "^4",
|
|
94
94
|
"react": "^18",
|
|
95
95
|
"react-dom": "^18",
|
|
@@ -100,6 +100,7 @@
|
|
|
100
100
|
"swr": "^2",
|
|
101
101
|
"systemjs": "^6.14.2",
|
|
102
102
|
"ts-md5": "^1",
|
|
103
|
+
"url-join": "^5",
|
|
103
104
|
"use-merge-value": "^1",
|
|
104
105
|
"utility-types": "^3",
|
|
105
106
|
"uuid": "^9",
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { readdirSync } from 'node:fs';
|
|
2
|
+
import { resolve } from 'node:path';
|
|
3
|
+
|
|
4
|
+
import i18nConfig from '../../.i18nrc';
|
|
5
|
+
|
|
6
|
+
export const root = resolve(__dirname, '../..');
|
|
7
|
+
export const localesDir = resolve(root, i18nConfig.output);
|
|
8
|
+
export const localeDir = (locale: string) => resolve(localesDir, locale);
|
|
9
|
+
export const localeDirJsonList = (locale: string) =>
|
|
10
|
+
readdirSync(localeDir(locale)).filter((name) => name.includes('.json'));
|
|
11
|
+
export const srcLocalesDir = resolve(root, './src/locales');
|
|
12
|
+
export const entryLocaleJsonFilepath = (file: string) =>
|
|
13
|
+
resolve(localesDir, i18nConfig.entryLocale, file);
|
|
14
|
+
export const outputLocaleJsonFilepath = (locale: string, file: string) =>
|
|
15
|
+
resolve(localesDir, locale, file);
|
|
16
|
+
export const srcLocalesResources = resolve(root, srcLocalesDir, 'resources');
|
|
17
|
+
export const localesResourcesFilepath = (locale: string) => resolve(srcLocalesResources, locale);
|
|
18
|
+
|
|
19
|
+
export { default as i18nConfig } from '../../.i18nrc';
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { consola } from 'consola';
|
|
2
|
+
import { colors } from 'consola/utils';
|
|
3
|
+
|
|
4
|
+
import { entryLocaleJsonFilepath, i18nConfig, localesResourcesFilepath } from './const';
|
|
5
|
+
import { tagWhite, writeJSON } from './utils';
|
|
6
|
+
|
|
7
|
+
export const genDefaultLocale = () => {
|
|
8
|
+
consola.info(`Default locale is ${i18nConfig.entryLocale}...`);
|
|
9
|
+
|
|
10
|
+
const resources = require(localesResourcesFilepath(i18nConfig.entryLocale));
|
|
11
|
+
const data = Object.entries(resources.default);
|
|
12
|
+
consola.start(`Generate default locale json, found ${data.length} namespaces...`);
|
|
13
|
+
|
|
14
|
+
for (const [ns, value] of data) {
|
|
15
|
+
const filepath = entryLocaleJsonFilepath(`${ns}.json`);
|
|
16
|
+
writeJSON(filepath, value);
|
|
17
|
+
consola.success(tagWhite(ns), colors.gray(filepath));
|
|
18
|
+
}
|
|
19
|
+
};
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { consola } from 'consola';
|
|
2
|
+
import { colors } from 'consola/utils';
|
|
3
|
+
import { existsSync } from 'node:fs';
|
|
4
|
+
|
|
5
|
+
import {
|
|
6
|
+
entryLocaleJsonFilepath,
|
|
7
|
+
i18nConfig,
|
|
8
|
+
localesResourcesFilepath,
|
|
9
|
+
outputLocaleJsonFilepath,
|
|
10
|
+
} from './const';
|
|
11
|
+
import { diff, readJSON, tagWhite, tagYellow, unset, writeJSON } from './utils';
|
|
12
|
+
|
|
13
|
+
export const genDiff = () => {
|
|
14
|
+
consola.start(`Diff between Dev/Prod local...`);
|
|
15
|
+
|
|
16
|
+
const resources = require(localesResourcesFilepath(i18nConfig.entryLocale));
|
|
17
|
+
const data = Object.entries(resources.default);
|
|
18
|
+
|
|
19
|
+
for (const [ns, devJSON] of data) {
|
|
20
|
+
const filepath = entryLocaleJsonFilepath(`${ns}.json`);
|
|
21
|
+
if (!existsSync(filepath)) continue;
|
|
22
|
+
const prodJSON = readJSON(filepath);
|
|
23
|
+
|
|
24
|
+
const diffKeys = diff(devJSON, prodJSON);
|
|
25
|
+
|
|
26
|
+
if (diffKeys.length === 0) {
|
|
27
|
+
consola.success(tagWhite(ns), colors.gray(filepath));
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
consola.warn(tagYellow(ns), diffKeys);
|
|
32
|
+
|
|
33
|
+
const clearLocals = [];
|
|
34
|
+
|
|
35
|
+
for (const locale of [i18nConfig.entryLocale, ...i18nConfig.outputLocales]) {
|
|
36
|
+
const localeFilepath = outputLocaleJsonFilepath(locale, `${ns}.json`);
|
|
37
|
+
if (!existsSync(localeFilepath)) continue;
|
|
38
|
+
const localeJSON = readJSON(localeFilepath);
|
|
39
|
+
|
|
40
|
+
for (const key of diffKeys) {
|
|
41
|
+
unset(localeJSON, key);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
writeJSON(localeFilepath, localeJSON);
|
|
45
|
+
clearLocals.push(locale);
|
|
46
|
+
}
|
|
47
|
+
consola.info('clear', clearLocals);
|
|
48
|
+
consola.success(tagWhite(ns), colors.gray(filepath));
|
|
49
|
+
}
|
|
50
|
+
};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { consola } from 'consola';
|
|
2
|
+
import { colors } from 'consola/utils';
|
|
3
|
+
import { writeFileSync } from 'node:fs';
|
|
4
|
+
|
|
5
|
+
import { i18nConfig, localeDirJsonList, localesResourcesFilepath } from './const';
|
|
6
|
+
import { genResourcesContent, genToc, tagBlue, tagGreen } from './utils';
|
|
7
|
+
|
|
8
|
+
const locales = [i18nConfig.entryLocale, ...i18nConfig.outputLocales];
|
|
9
|
+
|
|
10
|
+
export const genResources = () => {
|
|
11
|
+
consola.start(`Generate locale resources and types, found ${locales.length} locales...`);
|
|
12
|
+
|
|
13
|
+
for (const locale of locales) {
|
|
14
|
+
const files = localeDirJsonList(locale);
|
|
15
|
+
const toc = genToc(files, locale);
|
|
16
|
+
|
|
17
|
+
const filepath = localesResourcesFilepath(`${locale}.ts`);
|
|
18
|
+
writeFileSync(filepath, toc);
|
|
19
|
+
consola.success(tagBlue(locale), colors.gray(filepath));
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const indexFilepath = localesResourcesFilepath(`index.ts`);
|
|
23
|
+
writeFileSync(indexFilepath, genResourcesContent(locales));
|
|
24
|
+
|
|
25
|
+
consola.success(tagGreen('INDEX'), colors.gray(indexFilepath));
|
|
26
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { genDefaultLocale } from './genDefaultLocale';
|
|
2
|
+
import { genDiff } from './genDiff';
|
|
3
|
+
import { genResources } from './genResources';
|
|
4
|
+
import { split } from './utils';
|
|
5
|
+
|
|
6
|
+
split('DIFF ANALYSIS');
|
|
7
|
+
genDiff();
|
|
8
|
+
|
|
9
|
+
split('GENERATE DEFAULT LOCALE');
|
|
10
|
+
genDefaultLocale();
|
|
11
|
+
|
|
12
|
+
split('GENERATE RESOURCE & TOC');
|
|
13
|
+
genResources();
|
|
14
|
+
|
|
15
|
+
split('GENERATE I18N FILES');
|