@lobehub/chat 0.126.5 → 0.127.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.
- package/.env.example +8 -0
- package/CHANGELOG.md +50 -0
- package/Dockerfile +3 -0
- package/docs/Deployment/Environment-Variable.md +10 -0
- package/docs/Deployment/Environment-Variable.zh-CN.md +10 -0
- package/locales/ar/common.json +1 -0
- package/locales/ar/error.json +2 -0
- package/locales/ar/setting.json +16 -0
- package/locales/de-DE/common.json +1 -0
- package/locales/de-DE/error.json +2 -0
- package/locales/de-DE/setting.json +16 -0
- package/locales/en-US/common.json +1 -0
- package/locales/en-US/error.json +2 -0
- package/locales/en-US/setting.json +16 -0
- package/locales/es-ES/common.json +1 -0
- package/locales/es-ES/error.json +2 -0
- package/locales/es-ES/setting.json +16 -0
- package/locales/fr-FR/common.json +1 -0
- package/locales/fr-FR/error.json +2 -0
- package/locales/fr-FR/setting.json +16 -0
- package/locales/it-IT/common.json +1 -0
- package/locales/it-IT/error.json +2 -0
- package/locales/it-IT/setting.json +16 -0
- package/locales/ja-JP/common.json +1 -0
- package/locales/ja-JP/error.json +2 -0
- package/locales/ja-JP/setting.json +16 -0
- package/locales/ko-KR/common.json +1 -0
- package/locales/ko-KR/error.json +2 -0
- package/locales/ko-KR/setting.json +16 -0
- package/locales/nl-NL/common.json +1 -0
- package/locales/nl-NL/error.json +2 -0
- package/locales/nl-NL/setting.json +16 -0
- package/locales/pl-PL/common.json +1 -0
- package/locales/pl-PL/error.json +2 -0
- package/locales/pl-PL/setting.json +16 -0
- package/locales/pt-BR/common.json +1 -0
- package/locales/pt-BR/error.json +2 -0
- package/locales/pt-BR/setting.json +16 -0
- package/locales/ru-RU/common.json +1 -0
- package/locales/ru-RU/error.json +2 -0
- package/locales/ru-RU/setting.json +16 -0
- package/locales/tr-TR/common.json +1 -0
- package/locales/tr-TR/error.json +2 -0
- package/locales/tr-TR/setting.json +16 -0
- package/locales/vi-VN/common.json +1 -0
- package/locales/vi-VN/error.json +2 -0
- package/locales/vi-VN/setting.json +16 -0
- package/locales/zh-CN/common.json +1 -0
- package/locales/zh-CN/error.json +2 -0
- package/locales/zh-CN/setting.json +16 -0
- package/locales/zh-TW/common.json +1 -0
- package/locales/zh-TW/error.json +2 -0
- package/locales/zh-TW/setting.json +16 -0
- package/package.json +1 -1
- package/src/app/api/chat/[provider]/agentRuntime.ts +14 -0
- package/src/app/api/config/route.ts +2 -0
- package/src/app/api/errorResponse.ts +3 -0
- package/src/app/chat/features/ChatHeader/SettingButton.tsx +1 -2
- package/src/app/settings/(desktop)/features/Header.tsx +3 -4
- package/src/app/settings/(desktop)/features/SideBar.tsx +42 -0
- package/src/app/settings/(desktop)/index.tsx +4 -3
- package/src/app/settings/(desktop)/layout.desktop.tsx +14 -6
- package/src/app/settings/(desktop)/layout.responsive.tsx +4 -4
- package/src/app/settings/(mobile)/features/ExtraList.tsx +7 -5
- package/src/app/settings/(mobile)/features/Header/index.tsx +8 -5
- package/src/app/settings/(mobile)/index.tsx +1 -3
- package/src/app/settings/(mobile)/layout.mobile.tsx +8 -4
- package/src/app/settings/(mobile)/mobile/index.tsx +3 -5
- package/src/app/settings/agent/Agent.tsx +0 -4
- package/src/app/settings/agent/layout.tsx +9 -1
- package/src/app/settings/agent/page.tsx +17 -2
- package/src/app/settings/common/index.tsx +0 -3
- package/src/app/settings/common/layout.tsx +9 -1
- package/src/app/settings/features/SettingList/Item.tsx +50 -0
- package/src/app/settings/features/{SideBar/List.tsx → SettingList/index.tsx} +14 -15
- package/src/app/settings/layout.server.tsx +10 -3
- package/src/app/settings/llm/Azure/index.tsx +78 -106
- package/src/app/settings/llm/Bedrock/index.tsx +60 -89
- package/src/app/settings/llm/Google/index.tsx +26 -55
- package/src/app/settings/llm/Moonshot/index.tsx +29 -54
- package/src/app/settings/llm/Ollama/index.tsx +55 -0
- package/src/app/settings/llm/OpenAI/index.tsx +91 -107
- package/src/app/settings/llm/Zhipu/index.tsx +29 -54
- package/src/app/settings/llm/components/ProviderConfig/index.tsx +58 -0
- package/src/app/settings/llm/index.tsx +42 -0
- package/src/app/settings/llm/layout.tsx +9 -1
- package/src/app/settings/llm/page.tsx +6 -39
- package/src/app/settings/tts/layout.tsx +9 -1
- package/src/app/settings/tts/page.tsx +17 -2
- package/src/components/ModelProviderIcon/index.tsx +5 -1
- package/src/config/modelProviders/index.ts +3 -0
- package/src/config/modelProviders/ollama.ts +117 -0
- package/src/config/server/provider.ts +6 -0
- package/src/const/settings.ts +5 -0
- package/src/features/SideBar/BottomActions.tsx +1 -2
- package/src/layout/ResponsiveLayout.client.tsx +7 -7
- package/src/layout/ResponsiveLayout.server.tsx +6 -6
- package/src/libs/agent-runtime/error.ts +3 -0
- package/src/libs/agent-runtime/index.ts +1 -0
- package/src/libs/agent-runtime/ollama/index.ts +80 -0
- package/src/libs/agent-runtime/types/type.ts +1 -0
- package/src/locales/default/common.ts +1 -0
- package/src/locales/default/error.ts +3 -0
- package/src/locales/default/setting.ts +16 -0
- package/src/services/_auth.test.ts +132 -0
- package/src/services/_auth.ts +9 -1
- package/src/store/global/slices/common/initialState.ts +0 -2
- package/src/store/global/slices/settings/action.test.ts +0 -13
- package/src/store/global/slices/settings/action.ts +0 -5
- package/src/store/global/slices/settings/selectors/modelProvider.ts +31 -2
- package/src/types/settings/modelProvider.ts +8 -0
- package/src/app/settings/agent/index.tsx +0 -21
- package/src/app/settings/features/SideBar/Item.tsx +0 -44
- package/src/app/settings/features/SideBar/index.tsx +0 -42
- package/src/app/settings/tts/index.tsx +0 -21
- package/src/store/global/hooks/useSwitchSettingsOnInit.ts +0 -12
- /package/src/app/settings/llm/{Checker.tsx → components/Checker.tsx} +0 -0
- /package/src/app/settings/llm/{useSyncSettings.ts → components/ProviderConfig/useSyncSettings.ts} +0 -0
package/locales/pt-BR/error.json
CHANGED
|
@@ -42,10 +42,12 @@
|
|
|
42
42
|
"InvalidBedrockCredentials": "Credenciais Bedrock inválidas, por favor, verifique AccessKeyId/SecretAccessKey e tente novamente",
|
|
43
43
|
"InvalidGoogleAPIKey": "Chave de API Google incorreta ou vazia, por favor, verifique a chave de API Google e tente novamente",
|
|
44
44
|
"InvalidMoonshotAPIKey": "A chave da API Moonshot AI está incorreta ou vazia. Por favor, verifique a chave da API Moonshot e tente novamente.",
|
|
45
|
+
"InvalidOllamaArgs": "Configuração Ollama inválida, verifique a configuração do Ollama e tente novamente",
|
|
45
46
|
"InvalidZhipuAPIKey": "Chave de API Zhipu incorreta ou vazia, por favor, verifique a chave de API Zhipu e tente novamente",
|
|
46
47
|
"LocationNotSupportError": "Desculpe, sua localização atual não suporta este serviço de modelo, pode ser devido a restrições geográficas ou serviço não disponível. Por favor, verifique se a localização atual suporta o uso deste serviço ou tente usar outras informações de localização.",
|
|
47
48
|
"MoonshotBizError": "O serviço Moonshot na face oculta da lua encontrou um erro. Por favor, verifique as informações abaixo ou tente novamente.",
|
|
48
49
|
"NoOpenAIAPIKey": "A chave de API do OpenAI está em branco. Adicione uma chave de API personalizada do OpenAI",
|
|
50
|
+
"OllamaBizError": "Erro de negócio ao solicitar o serviço Ollama, verifique as informações a seguir ou tente novamente",
|
|
49
51
|
"OpenAIBizError": "Erro ao solicitar o serviço OpenAI. Verifique ou tente novamente com base nas informações abaixo",
|
|
50
52
|
"PluginApiNotFound": "Desculpe, o API especificado não existe no manifesto do plugin. Verifique se o método de solicitação corresponde ao API do manifesto do plugin",
|
|
51
53
|
"PluginApiParamsError": "Desculpe, a validação dos parâmetros de entrada da solicitação do plugin falhou. Verifique se os parâmetros de entrada correspondem às informações de descrição do API",
|
|
@@ -84,6 +84,22 @@
|
|
|
84
84
|
"title": "Chave da API"
|
|
85
85
|
}
|
|
86
86
|
},
|
|
87
|
+
"Ollama": {
|
|
88
|
+
"checker": {
|
|
89
|
+
"desc": "Verifique se o endereço do proxy está preenchido corretamente"
|
|
90
|
+
},
|
|
91
|
+
"customModelName": {
|
|
92
|
+
"desc": "Adicione modelos personalizados, separados por vírgula (,) se forem vários modelos",
|
|
93
|
+
"placeholder": "vicuna,llava,codellama,llama2:13b-text",
|
|
94
|
+
"title": "Nome do modelo personalizado"
|
|
95
|
+
},
|
|
96
|
+
"endpoint": {
|
|
97
|
+
"desc": "Insira o endereço do proxy da interface Ollama. Deixe em branco se não for especificado localmente",
|
|
98
|
+
"placeholder": "http://127.0.0.1:11434/v1",
|
|
99
|
+
"title": "Endereço do proxy da interface"
|
|
100
|
+
},
|
|
101
|
+
"title": "Ollama"
|
|
102
|
+
},
|
|
87
103
|
"OpenAI": {
|
|
88
104
|
"azureApiVersion": {
|
|
89
105
|
"desc": "Versão da API Azure, no formato YYYY-MM-DD. Consulte a [última versão](https://learn.microsoft.com/pt-br/azure/ai-services/openai/reference#chat-completions)",
|
package/locales/ru-RU/error.json
CHANGED
|
@@ -42,10 +42,12 @@
|
|
|
42
42
|
"InvalidBedrockCredentials": "Аутентификация Bedrock не прошла, пожалуйста, проверьте AccessKeyId/SecretAccessKey и повторите попытку",
|
|
43
43
|
"InvalidGoogleAPIKey": "Неверный или пустой ключ API Google, пожалуйста, проверьте ключ API Google и повторите попытку",
|
|
44
44
|
"InvalidMoonshotAPIKey": "Moonshot AI API Key неверный или пустой, пожалуйста, проверьте ключ API Moonshot и повторите попытку",
|
|
45
|
+
"InvalidOllamaArgs": "Неверная конфигурация Ollama, пожалуйста, проверьте конфигурацию Ollama и повторите попытку",
|
|
45
46
|
"InvalidZhipuAPIKey": "Неверный или пустой ключ API Zhipu, пожалуйста, проверьте ключ API Zhipu и повторите попытку",
|
|
46
47
|
"LocationNotSupportError": "Извините, ваше текущее местоположение не поддерживает эту службу модели, возможно из-за ограничений региона или недоступности службы. Пожалуйста, убедитесь, что текущее местоположение поддерживает использование этой службы, или попробуйте использовать другую информацию о местоположении.",
|
|
47
48
|
"MoonshotBizError": "请求月球暗面服务出错,请根据以下信息排查或重试",
|
|
48
49
|
"NoOpenAIAPIKey": "Ключ OpenAI API пуст, пожалуйста, добавьте свой собственный ключ OpenAI API",
|
|
50
|
+
"OllamaBizError": "Ошибка обращения к сервису Ollama, пожалуйста, проверьте следующую информацию или повторите попытку",
|
|
49
51
|
"OpenAIBizError": "Ошибка запроса службы OpenAI. Устраните неполадку или повторите попытку, основываясь на следующей информации.",
|
|
50
52
|
"PluginApiNotFound": "К сожалению, API не существует в манифесте плагина. Пожалуйста, проверьте, соответствует ли ваш метод запроса API манифеста плагина",
|
|
51
53
|
"PluginApiParamsError": "К сожалению, проверка входных параметров для запроса плагина не удалась. Пожалуйста, проверьте, соответствуют ли входные параметры описанию API",
|
|
@@ -84,6 +84,22 @@
|
|
|
84
84
|
"title": "Ключ API"
|
|
85
85
|
}
|
|
86
86
|
},
|
|
87
|
+
"Ollama": {
|
|
88
|
+
"checker": {
|
|
89
|
+
"desc": "Проверьте правильность заполнения адреса прокси"
|
|
90
|
+
},
|
|
91
|
+
"customModelName": {
|
|
92
|
+
"desc": "Добавьте пользовательскую модель, разделяя их запятыми (,)",
|
|
93
|
+
"placeholder": "викунья,льама,кодельльама,льама2:13b-текст",
|
|
94
|
+
"title": "Имя пользовательской модели"
|
|
95
|
+
},
|
|
96
|
+
"endpoint": {
|
|
97
|
+
"desc": "Введите адрес прокси-сервера Ollama, оставьте пустым, если не указано локально",
|
|
98
|
+
"placeholder": "http://127.0.0.1:11434/v1",
|
|
99
|
+
"title": "Адрес прокси-сервера"
|
|
100
|
+
},
|
|
101
|
+
"title": "Ollama"
|
|
102
|
+
},
|
|
87
103
|
"OpenAI": {
|
|
88
104
|
"azureApiVersion": {
|
|
89
105
|
"desc": "Версия API Azure, следуйте формату ГГГГ-ММ-ДД, см. [последнюю версию](https://learn.microsoft.com/ru-ru/azure/ai-services/openai/reference#chat-completions)",
|
package/locales/tr-TR/error.json
CHANGED
|
@@ -42,10 +42,12 @@
|
|
|
42
42
|
"InvalidBedrockCredentials": "Bedrock kimlik doğrulaması geçersiz, lütfen AccessKeyId/SecretAccessKey bilgilerinizi kontrol edip tekrar deneyin",
|
|
43
43
|
"InvalidGoogleAPIKey": "Google API Anahtarı yanlış veya boş, lütfen Google API Anahtarınızı kontrol edip tekrar deneyin",
|
|
44
44
|
"InvalidMoonshotAPIKey": "Geçersiz veya boş Moonshot AI API Anahtarı, lütfen Moonshot API Anahtarınızı kontrol edip tekrar deneyin",
|
|
45
|
+
"InvalidOllamaArgs": "Ollama yapılandırması yanlış, lütfen Ollama yapılandırmasını kontrol edip tekrar deneyin",
|
|
45
46
|
"InvalidZhipuAPIKey": "Zhipu API Anahtarı yanlış veya boş, lütfen Zhipu API Anahtarınızı kontrol edip tekrar deneyin",
|
|
46
47
|
"LocationNotSupportError": "Üzgünüz, bulunduğunuz konum bu model hizmetini desteklemiyor, muhtemelen bölge kısıtlamaları veya hizmetin henüz açılmamış olması nedeniyle. Lütfen mevcut konumun bu hizmeti kullanmaya uygun olup olmadığını doğrulayın veya başka bir konum bilgisi kullanmayı deneyin.",
|
|
47
48
|
"MoonshotBizError": "Moonshot hizmetinde bir hata oluştu, lütfen aşağıdaki bilgilere göre sorunu giderin veya tekrar deneyin",
|
|
48
49
|
"NoOpenAIAPIKey": "OpenAI API Anahtarı boş, lütfen özel bir OpenAI API Anahtarı ekleyin",
|
|
50
|
+
"OllamaBizError": "Ollama servisine yapılan istekte hata oluştu, lütfen aşağıdaki bilgilere göre sorunu gidermeye çalışın veya tekrar deneyin",
|
|
49
51
|
"OpenAIBizError": "OpenAI hizmeti talep ederken hata oluştu. Aşağıdaki bilgilere dayanarak sorun giderin veya tekrar deneyin.",
|
|
50
52
|
"PluginApiNotFound": "Üzgünüm, eklentinin bildiriminde API mevcut değil. Lütfen istek yönteminizin eklenti bildirim API'sı ile eşleşip eşleşmediğini kontrol edin",
|
|
51
53
|
"PluginApiParamsError": "Üzgünüm, eklenti isteği için giriş parametre doğrulaması başarısız oldu. Lütfen giriş parametrelerinin API açıklamasıyla eşleşip eşleşmediğini kontrol edin",
|
|
@@ -84,6 +84,22 @@
|
|
|
84
84
|
"title": "API 密钥"
|
|
85
85
|
}
|
|
86
86
|
},
|
|
87
|
+
"Ollama": {
|
|
88
|
+
"checker": {
|
|
89
|
+
"desc": "Proxy adresinin doğru şekilde doldurulup doldurulmadığını test edin"
|
|
90
|
+
},
|
|
91
|
+
"customModelName": {
|
|
92
|
+
"desc": "Özel model ekleyin, birden fazla model virgül (,) ile ayrılır",
|
|
93
|
+
"placeholder": "vicuna,llama,codellama,llama2:13b-text",
|
|
94
|
+
"title": "Özel Model Adı"
|
|
95
|
+
},
|
|
96
|
+
"endpoint": {
|
|
97
|
+
"desc": "Ollama arayüzü proxy adresini girin, yerel olarak özel bir adres belirtilmemişse boş bırakın",
|
|
98
|
+
"placeholder": "http://127.0.0.1:11434/v1",
|
|
99
|
+
"title": "Proxy Adresi"
|
|
100
|
+
},
|
|
101
|
+
"title": "Ollama"
|
|
102
|
+
},
|
|
87
103
|
"OpenAI": {
|
|
88
104
|
"azureApiVersion": {
|
|
89
105
|
"desc": "Azure için API sürümü, YYYY-MM-DD formatını takip eder, [en son sürümü kontrol edin](https://learn.microsoft.com/en-us/azure/ai-services/openai/reference#chat-completions)",
|
package/locales/vi-VN/error.json
CHANGED
|
@@ -42,10 +42,12 @@
|
|
|
42
42
|
"InvalidBedrockCredentials": "Xác thực Bedrock không thành công, vui lòng kiểm tra AccessKeyId/SecretAccessKey và thử lại",
|
|
43
43
|
"InvalidGoogleAPIKey": "Khóa API Google không chính xác hoặc trống, vui lòng kiểm tra lại Khóa API Google và thử lại",
|
|
44
44
|
"InvalidMoonshotAPIKey": "Khóa API Moonshot AI không hợp lệ hoặc trống, vui lòng kiểm tra lại Khóa API Moonshot và thử lại",
|
|
45
|
+
"InvalidOllamaArgs": "Cấu hình Ollama không hợp lệ, vui lòng kiểm tra lại cấu hình Ollama và thử lại",
|
|
45
46
|
"InvalidZhipuAPIKey": "Khóa API Zhipu không chính xác hoặc trống, vui lòng kiểm tra lại Khóa API Zhipu và thử lại",
|
|
46
47
|
"LocationNotSupportError": "Xin lỗi, vị trí của bạn không hỗ trợ dịch vụ mô hình này, có thể do hạn chế vùng miền hoặc dịch vụ chưa được mở. Vui lòng xác nhận xem vị trí hiện tại có hỗ trợ sử dụng dịch vụ này không, hoặc thử sử dụng thông tin vị trí khác.",
|
|
47
48
|
"MoonshotBizError": "Yêu cầu dịch vụ Mặt Trăng Tối gặp sự cố, vui lòng kiểm tra thông tin dưới đây hoặc thử lại",
|
|
48
49
|
"NoOpenAIAPIKey": "Khóa API OpenAI trống, vui lòng thêm Khóa API OpenAI tùy chỉnh",
|
|
50
|
+
"OllamaBizError": "Yêu cầu dịch vụ Ollama gặp lỗi, vui lòng kiểm tra thông tin dưới đây hoặc thử lại",
|
|
49
51
|
"OpenAIBizError": "Yêu cầu dịch vụ OpenAI gặp lỗi, vui lòng xác minh hoặc thử lại dựa trên thông tin dưới đây",
|
|
50
52
|
"PluginApiNotFound": "Xin lỗi, không có API nào trong tệp mô tả plugin, vui lòng kiểm tra phương thức yêu cầu của bạn có khớp với API mô tả plugin không",
|
|
51
53
|
"PluginApiParamsError": "Xin lỗi, kiểm tra tham số đầu vào yêu cầu của plugin không thông qua, vui lòng kiểm tra tham số đầu vào có khớp với thông tin mô tả API không",
|
|
@@ -84,6 +84,22 @@
|
|
|
84
84
|
"title": "Khóa API"
|
|
85
85
|
}
|
|
86
86
|
},
|
|
87
|
+
"Ollama": {
|
|
88
|
+
"checker": {
|
|
89
|
+
"desc": "Kiểm tra xem địa chỉ proxy có được điền đúng không"
|
|
90
|
+
},
|
|
91
|
+
"customModelName": {
|
|
92
|
+
"desc": "Thêm mô hình tùy chỉnh, nhiều mô hình sử dụng dấu phẩy (,) để ngăn cách",
|
|
93
|
+
"placeholder": "vicuna,llava,codellama,llama2:13b-text",
|
|
94
|
+
"title": "Tên mô hình tùy chỉnh"
|
|
95
|
+
},
|
|
96
|
+
"endpoint": {
|
|
97
|
+
"desc": "Nhập địa chỉ proxy giao diện Ollama, để trống nếu không được chỉ định cụ thể",
|
|
98
|
+
"placeholder": "http://127.0.0.1:11434/v1",
|
|
99
|
+
"title": "Địa chỉ proxy giao diện"
|
|
100
|
+
},
|
|
101
|
+
"title": "Ollama"
|
|
102
|
+
},
|
|
87
103
|
"OpenAI": {
|
|
88
104
|
"azureApiVersion": {
|
|
89
105
|
"desc": "Phiên bản API của Azure, theo định dạng YYYY-MM-DD, xem chi tiết tại [phiên bản mới nhất](https://learn.microsoft.com/zh-cn/azure/ai-services/openai/reference#chat-completions)",
|
package/locales/zh-CN/error.json
CHANGED
|
@@ -59,6 +59,8 @@
|
|
|
59
59
|
"BedrockBizError": "请求 Bedrock 服务出错,请根据以下信息排查或重试",
|
|
60
60
|
"InvalidAzureAPIKey": "Azure API Key 不正确或为空,请检查 Azure API Key 后重试",
|
|
61
61
|
"AzureBizError": "请求 Azure AI 服务出错,请根据以下信息排查或重试",
|
|
62
|
+
"InvalidOllamaArgs": "Ollama 配置不正确,请检查 Ollama 配置后重试",
|
|
63
|
+
"OllamaBizError": "请求 Ollama 服务出错,请根据以下信息排查或重试",
|
|
62
64
|
"AgentRuntimeError": "Lobe 语言模型运行时执行出错,请根据以下信息排查或重试"
|
|
63
65
|
},
|
|
64
66
|
"stt": {
|
|
@@ -84,6 +84,22 @@
|
|
|
84
84
|
"title": "API Key"
|
|
85
85
|
}
|
|
86
86
|
},
|
|
87
|
+
"Ollama": {
|
|
88
|
+
"checker": {
|
|
89
|
+
"desc": "测试代理地址是否正确填写"
|
|
90
|
+
},
|
|
91
|
+
"customModelName": {
|
|
92
|
+
"desc": "增加自定义模型,多个模型使用逗号(,)隔开",
|
|
93
|
+
"placeholder": "vicuna,llava,codellama,llama2:13b-text",
|
|
94
|
+
"title": "自定义模型名称"
|
|
95
|
+
},
|
|
96
|
+
"endpoint": {
|
|
97
|
+
"desc": "填入 Ollama 接口代理地址,本地未额外指定可留空",
|
|
98
|
+
"placeholder": "http://127.0.0.1:11434/v1",
|
|
99
|
+
"title": "接口代理地址"
|
|
100
|
+
},
|
|
101
|
+
"title": "Ollama"
|
|
102
|
+
},
|
|
87
103
|
"OpenAI": {
|
|
88
104
|
"azureApiVersion": {
|
|
89
105
|
"desc": "Azure 的 API 版本,遵循 YYYY-MM-DD 格式,查阅[最新版本](https://learn.microsoft.com/zh-cn/azure/ai-services/openai/reference#chat-completions)",
|
package/locales/zh-TW/error.json
CHANGED
|
@@ -42,10 +42,12 @@
|
|
|
42
42
|
"InvalidBedrockCredentials": "Bedrock 驗證未通過,請檢查 AccessKeyId/SecretAccessKey 後重試",
|
|
43
43
|
"InvalidGoogleAPIKey": "Google API Key 不正確或為空,請檢查 Google API Key 後重試",
|
|
44
44
|
"InvalidMoonshotAPIKey": "Moonshot AI API 金鑰不正確或為空,請檢查 Moonshot API 金鑰後重試",
|
|
45
|
+
"InvalidOllamaArgs": "Ollama 配置不正確,請檢查 Ollama 配置後重試",
|
|
45
46
|
"InvalidZhipuAPIKey": "Zhipu API Key 不正確或為空,請檢查 Zhipu API Key 後重試",
|
|
46
47
|
"LocationNotSupportError": "很抱歉,你的所在位置不支持此模型服務,可能是由於地區限制或服務未開通。請確認當前位置是否支持使用此服務,或嘗試使用其他位置信息。",
|
|
47
48
|
"MoonshotBizError": "請求月球背面服務出錯,請根據以下信息排查或重試",
|
|
48
49
|
"NoOpenAIAPIKey": "OpenAI API 金鑰為空,請添加自訂 OpenAI API 金鑰",
|
|
50
|
+
"OllamaBizError": "請求 Ollama 服務出錯,請根據以下資訊排查或重試",
|
|
49
51
|
"OpenAIBizError": "請求 OpenAI 服務出錯。請根據以下資訊進行排查或重試。",
|
|
50
52
|
"PluginApiNotFound": "抱歉,外掛描述檔案中不存在該 API。請檢查您的請求方法與外掛清單 API 是否相符",
|
|
51
53
|
"PluginApiParamsError": "抱歉,該外掛請求的輸入參數驗證失敗。請檢查輸入參數與 API 描述資訊是否相符",
|
|
@@ -84,6 +84,22 @@
|
|
|
84
84
|
"title": "API 金鑰"
|
|
85
85
|
}
|
|
86
86
|
},
|
|
87
|
+
"Ollama": {
|
|
88
|
+
"checker": {
|
|
89
|
+
"desc": "檢查代理地址是否正確填寫"
|
|
90
|
+
},
|
|
91
|
+
"customModelName": {
|
|
92
|
+
"desc": "新增自定義模型,多個模型使用逗號(,)隔開",
|
|
93
|
+
"placeholder": "維庫納,利亞瓦,科迪拉瑪,拉瑪2:13b-文本",
|
|
94
|
+
"title": "自定義模型名稱"
|
|
95
|
+
},
|
|
96
|
+
"endpoint": {
|
|
97
|
+
"desc": "填入 Ollama 接口代理地址,本地未額外指定可留空",
|
|
98
|
+
"placeholder": "http://127.0.0.1:11434/v1",
|
|
99
|
+
"title": "接口代理地址"
|
|
100
|
+
},
|
|
101
|
+
"title": "Ollama"
|
|
102
|
+
},
|
|
87
103
|
"OpenAI": {
|
|
88
104
|
"azureApiVersion": {
|
|
89
105
|
"desc": "Azure 的 API 版本,遵循 YYYY-MM-DD 格式,查閱[最新版本](https://learn.microsoft.com/zh-cn/azure/ai-services/openai/reference#chat-completions)",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lobehub/chat",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.127.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",
|
|
@@ -6,6 +6,7 @@ import {
|
|
|
6
6
|
LobeBedrockAI,
|
|
7
7
|
LobeGoogleAI,
|
|
8
8
|
LobeMoonshotAI,
|
|
9
|
+
LobeOllamaAI,
|
|
9
10
|
LobeOpenAI,
|
|
10
11
|
LobeRuntimeAI,
|
|
11
12
|
LobeZhipuAI,
|
|
@@ -66,6 +67,12 @@ class AgentRuntime {
|
|
|
66
67
|
|
|
67
68
|
case ModelProvider.Bedrock: {
|
|
68
69
|
runtimeModel = this.initBedrock(payload);
|
|
70
|
+
break;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
case ModelProvider.Ollama: {
|
|
74
|
+
runtimeModel = this.initOllama(payload);
|
|
75
|
+
break;
|
|
69
76
|
}
|
|
70
77
|
}
|
|
71
78
|
|
|
@@ -138,6 +145,13 @@ class AgentRuntime {
|
|
|
138
145
|
|
|
139
146
|
return new LobeBedrockAI({ accessKeyId, accessKeySecret, region });
|
|
140
147
|
}
|
|
148
|
+
|
|
149
|
+
private static initOllama(payload: JWTPayload) {
|
|
150
|
+
const { OLLAMA_PROXY_URL } = getServerConfig();
|
|
151
|
+
const baseUrl = payload?.endpoint || OLLAMA_PROXY_URL;
|
|
152
|
+
|
|
153
|
+
return new LobeOllamaAI(baseUrl);
|
|
154
|
+
}
|
|
141
155
|
}
|
|
142
156
|
|
|
143
157
|
export default AgentRuntime;
|
|
@@ -14,6 +14,7 @@ export const GET = async () => {
|
|
|
14
14
|
ENABLED_AWS_BEDROCK,
|
|
15
15
|
ENABLED_GOOGLE,
|
|
16
16
|
ENABLE_OAUTH_SSO,
|
|
17
|
+
ENABLE_OLLAMA,
|
|
17
18
|
} = getServerConfig();
|
|
18
19
|
|
|
19
20
|
const config: GlobalServerConfig = {
|
|
@@ -23,6 +24,7 @@ export const GET = async () => {
|
|
|
23
24
|
bedrock: { enabled: ENABLED_AWS_BEDROCK },
|
|
24
25
|
google: { enabled: ENABLED_GOOGLE },
|
|
25
26
|
moonshot: { enabled: ENABLED_MOONSHOT },
|
|
27
|
+
ollama: { enabled: ENABLE_OLLAMA },
|
|
26
28
|
zhipu: { enabled: ENABLED_ZHIPU },
|
|
27
29
|
},
|
|
28
30
|
};
|
|
@@ -6,7 +6,7 @@ import { useTranslation } from 'react-i18next';
|
|
|
6
6
|
|
|
7
7
|
import { DESKTOP_HEADER_ICON_SIZE, MOBILE_HEADER_ICON_SIZE } from '@/const/layoutTokens';
|
|
8
8
|
import { useGlobalStore } from '@/store/global';
|
|
9
|
-
import {
|
|
9
|
+
import { SidebarTabKey } from '@/store/global/slices/common/initialState';
|
|
10
10
|
import { useSessionStore } from '@/store/session';
|
|
11
11
|
import { sessionSelectors } from '@/store/session/selectors';
|
|
12
12
|
import { pathString } from '@/utils/url';
|
|
@@ -22,7 +22,6 @@ const SettingButton = memo<{ mobile?: boolean }>(({ mobile }) => {
|
|
|
22
22
|
onClick={() => {
|
|
23
23
|
if (isInbox) {
|
|
24
24
|
useGlobalStore.setState({
|
|
25
|
-
settingsTab: SettingsTabs.Agent,
|
|
26
25
|
sidebarKey: SidebarTabKey.Setting,
|
|
27
26
|
});
|
|
28
27
|
router.push('/settings/agent');
|
|
@@ -2,17 +2,16 @@ import { ChatHeader, ChatHeaderTitle } from '@lobehub/ui';
|
|
|
2
2
|
import { memo } from 'react';
|
|
3
3
|
import { useTranslation } from 'react-i18next';
|
|
4
4
|
|
|
5
|
-
import {
|
|
5
|
+
import { SettingsTabs } from '@/store/global/initialState';
|
|
6
6
|
|
|
7
|
-
const Header = memo(() => {
|
|
7
|
+
const Header = memo(({ activeTab }: { activeTab: SettingsTabs }) => {
|
|
8
8
|
const { t } = useTranslation('setting');
|
|
9
|
-
const tab = useGlobalStore((s) => s.settingsTab);
|
|
10
9
|
|
|
11
10
|
return (
|
|
12
11
|
<ChatHeader
|
|
13
12
|
left={
|
|
14
13
|
<div style={{ paddingLeft: 8 }}>
|
|
15
|
-
<ChatHeaderTitle title={t(`tab.${
|
|
14
|
+
<ChatHeaderTitle title={t(`tab.${activeTab}`)} />
|
|
16
15
|
</div>
|
|
17
16
|
}
|
|
18
17
|
/>
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { createStyles, useResponsive } from 'antd-style';
|
|
2
|
+
import { memo } from 'react';
|
|
3
|
+
import { useTranslation } from 'react-i18next';
|
|
4
|
+
import { Flexbox } from 'react-layout-kit';
|
|
5
|
+
|
|
6
|
+
import SettingList, { SettingListProps } from '../../features/SettingList';
|
|
7
|
+
import UpgradeAlert from '../../features/UpgradeAlert';
|
|
8
|
+
|
|
9
|
+
const useStyles = createStyles(({ stylish, token, css }) => ({
|
|
10
|
+
body: stylish.noScrollbar,
|
|
11
|
+
container: css`
|
|
12
|
+
border-inline-end: 1px solid ${token.colorBorder};
|
|
13
|
+
`,
|
|
14
|
+
logo: css`
|
|
15
|
+
fill: ${token.colorText};
|
|
16
|
+
`,
|
|
17
|
+
top: css`
|
|
18
|
+
font-size: 20px;
|
|
19
|
+
font-weight: bold;
|
|
20
|
+
`,
|
|
21
|
+
}));
|
|
22
|
+
|
|
23
|
+
const SideBar = memo<SettingListProps>(({ activeTab }) => {
|
|
24
|
+
const { styles } = useStyles();
|
|
25
|
+
|
|
26
|
+
const { t } = useTranslation('common');
|
|
27
|
+
const { mobile } = useResponsive();
|
|
28
|
+
|
|
29
|
+
return (
|
|
30
|
+
<Flexbox className={styles.container} width={280}>
|
|
31
|
+
<Flexbox className={styles.top} padding={16}>
|
|
32
|
+
{t('setting')}
|
|
33
|
+
</Flexbox>
|
|
34
|
+
<Flexbox gap={8} style={{ paddingInline: 8 }}>
|
|
35
|
+
<UpgradeAlert />
|
|
36
|
+
<SettingList activeTab={activeTab} mobile={mobile} />
|
|
37
|
+
</Flexbox>
|
|
38
|
+
</Flexbox>
|
|
39
|
+
);
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
export default SideBar;
|
|
@@ -4,17 +4,18 @@ import dynamic from 'next/dynamic';
|
|
|
4
4
|
import { FC, memo } from 'react';
|
|
5
5
|
|
|
6
6
|
import ResponsiveIndex from '@/components/ResponsiveIndex';
|
|
7
|
+
import { SettingsTabs } from '@/store/global/initialState';
|
|
7
8
|
|
|
8
9
|
import Common from '../common';
|
|
9
10
|
import { SettingsCommonProps } from '../common/Common';
|
|
10
|
-
import
|
|
11
|
+
import DesktopLayout from './layout.desktop';
|
|
11
12
|
|
|
12
13
|
const Mobile: FC = dynamic(() => import('../(mobile)'), { ssr: false }) as FC;
|
|
13
14
|
|
|
14
15
|
export default memo<SettingsCommonProps>((props) => (
|
|
15
16
|
<ResponsiveIndex Mobile={Mobile}>
|
|
16
|
-
<
|
|
17
|
+
<DesktopLayout activeTab={SettingsTabs.Common}>
|
|
17
18
|
<Common {...props} />
|
|
18
|
-
</
|
|
19
|
+
</DesktopLayout>
|
|
19
20
|
</ResponsiveIndex>
|
|
20
21
|
));
|
|
@@ -1,23 +1,29 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
|
-
import {
|
|
3
|
+
import { ReactNode, memo } from 'react';
|
|
4
4
|
import { Center, Flexbox } from 'react-layout-kit';
|
|
5
5
|
|
|
6
6
|
import SafeSpacing from '@/components/SafeSpacing';
|
|
7
7
|
import AppLayoutDesktop from '@/layout/AppLayout.desktop';
|
|
8
8
|
import { useSwitchSideBarOnInit } from '@/store/global';
|
|
9
|
-
import { SidebarTabKey } from '@/store/global/initialState';
|
|
9
|
+
import { SettingsTabs, SidebarTabKey } from '@/store/global/initialState';
|
|
10
10
|
|
|
11
|
-
import SideBar from '../features/SideBar';
|
|
12
11
|
import Header from './features/Header';
|
|
12
|
+
import SideBar from './features/SideBar';
|
|
13
13
|
|
|
14
|
-
export
|
|
14
|
+
export interface DesktopLayoutProps {
|
|
15
|
+
activeTab: SettingsTabs;
|
|
16
|
+
children: ReactNode;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
const DesktopLayout = memo<DesktopLayoutProps>(({ children, activeTab }) => {
|
|
15
20
|
useSwitchSideBarOnInit(SidebarTabKey.Setting);
|
|
21
|
+
|
|
16
22
|
return (
|
|
17
23
|
<AppLayoutDesktop>
|
|
18
|
-
<SideBar />
|
|
24
|
+
<SideBar activeTab={activeTab} />
|
|
19
25
|
<Flexbox flex={1} height={'100%'} style={{ position: 'relative' }}>
|
|
20
|
-
<Header />
|
|
26
|
+
<Header activeTab={activeTab} />
|
|
21
27
|
<Flexbox align={'center'} flex={1} padding={24} style={{ overflow: 'auto' }}>
|
|
22
28
|
<SafeSpacing />
|
|
23
29
|
<Center gap={16} width={'100%'}>
|
|
@@ -28,3 +34,5 @@ export default memo(({ children }: PropsWithChildren) => {
|
|
|
28
34
|
</AppLayoutDesktop>
|
|
29
35
|
);
|
|
30
36
|
});
|
|
37
|
+
|
|
38
|
+
export default DesktopLayout;
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
3
|
import dynamic from 'next/dynamic';
|
|
4
|
-
import { FC,
|
|
4
|
+
import { FC, memo } from 'react';
|
|
5
5
|
|
|
6
6
|
import ResponsiveLayout from '@/layout/ResponsiveLayout.client';
|
|
7
7
|
|
|
8
|
-
import DesktopLayout from './layout.desktop';
|
|
8
|
+
import DesktopLayout, { DesktopLayoutProps } from './layout.desktop';
|
|
9
9
|
|
|
10
10
|
const MobileLayout = dynamic(() => import('../(mobile)/layout.mobile'), { ssr: false }) as FC;
|
|
11
11
|
|
|
12
|
-
export default memo(({ children }
|
|
13
|
-
<ResponsiveLayout Desktop={DesktopLayout} Mobile={MobileLayout}>
|
|
12
|
+
export default memo<DesktopLayoutProps>(({ children, activeTab }) => (
|
|
13
|
+
<ResponsiveLayout Desktop={DesktopLayout} Mobile={MobileLayout} activeTab={activeTab}>
|
|
14
14
|
{children}
|
|
15
15
|
</ResponsiveLayout>
|
|
16
16
|
));
|
|
@@ -7,15 +7,17 @@ import { useTranslation } from 'react-i18next';
|
|
|
7
7
|
import { ABOUT, CHANGELOG, FEEDBACK } from '@/const/url';
|
|
8
8
|
import { useImportConfig } from '@/hooks/useImportConfig';
|
|
9
9
|
import { configService } from '@/services/config';
|
|
10
|
-
import {
|
|
10
|
+
import { SettingsTabs } from '@/store/global/initialState';
|
|
11
11
|
|
|
12
|
-
import Item from '../../features/
|
|
12
|
+
import Item from '../../features/SettingList/Item';
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
interface ExtraListProps {
|
|
15
|
+
activeTab?: SettingsTabs;
|
|
16
|
+
}
|
|
17
|
+
const ExtraList = memo<ExtraListProps>(({ activeTab }) => {
|
|
15
18
|
const { t } = useTranslation('common');
|
|
16
19
|
|
|
17
20
|
const { importConfig } = useImportConfig();
|
|
18
|
-
const tab = useGlobalStore((s) => s.settingsTab);
|
|
19
21
|
const { mobile } = useResponsive();
|
|
20
22
|
const items = [
|
|
21
23
|
{
|
|
@@ -59,7 +61,7 @@ const ExtraList = memo(() => {
|
|
|
59
61
|
</Upload>
|
|
60
62
|
{items.map(({ value, icon, label, onClick }) => (
|
|
61
63
|
<div key={value} onClick={onClick}>
|
|
62
|
-
<Item active={mobile ? false :
|
|
64
|
+
<Item active={mobile ? false : activeTab === value} icon={icon} label={label} />
|
|
63
65
|
</div>
|
|
64
66
|
))}
|
|
65
67
|
</>
|
|
@@ -3,18 +3,21 @@ import { useRouter } from 'next/navigation';
|
|
|
3
3
|
import { memo } from 'react';
|
|
4
4
|
import { useTranslation } from 'react-i18next';
|
|
5
5
|
|
|
6
|
-
import {
|
|
6
|
+
import { SettingsTabs } from '@/store/global/initialState';
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
interface HeaderProps {
|
|
9
|
+
activeTab: SettingsTabs;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
const Header = memo<HeaderProps>(({ activeTab }) => {
|
|
9
13
|
const { t } = useTranslation('setting');
|
|
10
|
-
const tab = useGlobalStore((s) => s.settingsTab);
|
|
11
14
|
|
|
12
15
|
const router = useRouter();
|
|
13
16
|
|
|
14
17
|
return (
|
|
15
18
|
<MobileNavBar
|
|
16
|
-
center={<MobileNavBarTitle title={t(`tab.${
|
|
17
|
-
onBackClick={() => router.
|
|
19
|
+
center={<MobileNavBarTitle title={t(`tab.${activeTab}`)} />}
|
|
20
|
+
onBackClick={() => router.push('/settings')}
|
|
18
21
|
showBackButton
|
|
19
22
|
/>
|
|
20
23
|
);
|
|
@@ -1,18 +1,22 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
|
-
import {
|
|
3
|
+
import { ReactNode, memo } from 'react';
|
|
4
4
|
import { Flexbox } from 'react-layout-kit';
|
|
5
5
|
|
|
6
6
|
import AppLayoutMobile from '@/layout/AppLayout.mobile';
|
|
7
7
|
import { useSwitchSideBarOnInit } from '@/store/global';
|
|
8
|
-
import { SidebarTabKey } from '@/store/global/initialState';
|
|
8
|
+
import { SettingsTabs, SidebarTabKey } from '@/store/global/initialState';
|
|
9
9
|
|
|
10
10
|
import Header from './features/Header';
|
|
11
11
|
|
|
12
|
-
export
|
|
12
|
+
export interface SettingLayoutProps {
|
|
13
|
+
activeTab: SettingsTabs;
|
|
14
|
+
children: ReactNode;
|
|
15
|
+
}
|
|
16
|
+
export default memo(({ children, activeTab }: SettingLayoutProps) => {
|
|
13
17
|
useSwitchSideBarOnInit(SidebarTabKey.Setting);
|
|
14
18
|
return (
|
|
15
|
-
<AppLayoutMobile navBar={<Header />}>
|
|
19
|
+
<AppLayoutMobile navBar={<Header activeTab={activeTab} />}>
|
|
16
20
|
<Flexbox style={{ overflow: 'auto' }}>{children}</Flexbox>
|
|
17
21
|
</AppLayoutMobile>
|
|
18
22
|
);
|