@lobehub/chat 1.23.0 → 1.24.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.
Files changed (79) hide show
  1. package/CHANGELOG.md +51 -0
  2. package/Dockerfile +19 -15
  3. package/Dockerfile.database +20 -16
  4. package/locales/ar/modelProvider.json +16 -0
  5. package/locales/ar/models.json +27 -0
  6. package/locales/ar/providers.json +1 -0
  7. package/locales/bg-BG/modelProvider.json +16 -0
  8. package/locales/bg-BG/models.json +27 -0
  9. package/locales/bg-BG/providers.json +1 -0
  10. package/locales/de-DE/modelProvider.json +16 -0
  11. package/locales/de-DE/models.json +27 -0
  12. package/locales/de-DE/providers.json +1 -0
  13. package/locales/en-US/modelProvider.json +16 -0
  14. package/locales/en-US/models.json +27 -0
  15. package/locales/en-US/providers.json +1 -0
  16. package/locales/es-ES/modelProvider.json +16 -0
  17. package/locales/es-ES/models.json +27 -0
  18. package/locales/es-ES/providers.json +1 -0
  19. package/locales/fr-FR/modelProvider.json +16 -0
  20. package/locales/fr-FR/models.json +27 -0
  21. package/locales/fr-FR/providers.json +1 -0
  22. package/locales/it-IT/modelProvider.json +16 -0
  23. package/locales/it-IT/models.json +27 -0
  24. package/locales/it-IT/providers.json +1 -0
  25. package/locales/ja-JP/modelProvider.json +16 -0
  26. package/locales/ja-JP/models.json +27 -0
  27. package/locales/ja-JP/providers.json +1 -0
  28. package/locales/ko-KR/modelProvider.json +16 -0
  29. package/locales/ko-KR/models.json +27 -0
  30. package/locales/ko-KR/providers.json +1 -0
  31. package/locales/nl-NL/modelProvider.json +16 -0
  32. package/locales/nl-NL/models.json +27 -0
  33. package/locales/nl-NL/providers.json +1 -0
  34. package/locales/pl-PL/modelProvider.json +16 -0
  35. package/locales/pl-PL/models.json +27 -0
  36. package/locales/pl-PL/providers.json +1 -0
  37. package/locales/pt-BR/modelProvider.json +16 -0
  38. package/locales/pt-BR/models.json +27 -0
  39. package/locales/pt-BR/providers.json +1 -0
  40. package/locales/ru-RU/modelProvider.json +16 -0
  41. package/locales/ru-RU/models.json +27 -0
  42. package/locales/ru-RU/providers.json +1 -0
  43. package/locales/tr-TR/modelProvider.json +16 -0
  44. package/locales/tr-TR/models.json +27 -0
  45. package/locales/tr-TR/providers.json +1 -0
  46. package/locales/vi-VN/modelProvider.json +16 -0
  47. package/locales/vi-VN/models.json +27 -0
  48. package/locales/vi-VN/providers.json +1 -0
  49. package/locales/zh-CN/modelProvider.json +16 -0
  50. package/locales/zh-CN/models.json +27 -0
  51. package/locales/zh-CN/providers.json +1 -0
  52. package/locales/zh-TW/modelProvider.json +16 -0
  53. package/locales/zh-TW/models.json +27 -0
  54. package/locales/zh-TW/providers.json +1 -0
  55. package/package.json +3 -3
  56. package/src/app/(main)/settings/llm/ProviderList/SenseNova/index.tsx +44 -0
  57. package/src/app/(main)/settings/llm/ProviderList/providers.tsx +4 -0
  58. package/src/config/llm.ts +38 -0
  59. package/src/config/modelProviders/index.ts +4 -0
  60. package/src/config/modelProviders/sensenova.ts +124 -0
  61. package/src/config/modelProviders/spark.ts +6 -6
  62. package/src/const/auth.ts +3 -0
  63. package/src/const/settings/llm.ts +5 -0
  64. package/src/features/Conversation/Error/APIKeyForm/SenseNova.tsx +49 -0
  65. package/src/features/Conversation/Error/APIKeyForm/index.tsx +3 -0
  66. package/src/libs/agent-runtime/AgentRuntime.ts +7 -0
  67. package/src/libs/agent-runtime/index.ts +1 -0
  68. package/src/libs/agent-runtime/sensenova/authToken.test.ts +18 -0
  69. package/src/libs/agent-runtime/sensenova/authToken.ts +27 -0
  70. package/src/libs/agent-runtime/sensenova/index.test.ts +321 -0
  71. package/src/libs/agent-runtime/sensenova/index.ts +98 -0
  72. package/src/libs/agent-runtime/types/type.ts +1 -0
  73. package/src/locales/default/modelProvider.ts +17 -0
  74. package/src/server/globalConfig/index.ts +158 -16
  75. package/src/server/modules/AgentRuntime/index.ts +10 -0
  76. package/src/services/_auth.ts +14 -0
  77. package/src/store/user/slices/modelList/selectors/keyVaults.ts +2 -0
  78. package/src/store/user/slices/modelList/selectors/modelConfig.ts +2 -0
  79. package/src/types/user/settings/keyVaults.ts +6 -0
@@ -4,20 +4,35 @@ import { fileEnv } from '@/config/file';
4
4
  import { langfuseEnv } from '@/config/langfuse';
5
5
  import { getLLMConfig } from '@/config/llm';
6
6
  import {
7
+ Ai21ProviderCard,
8
+ Ai360ProviderCard,
9
+ AnthropicProviderCard,
10
+ BaichuanProviderCard,
7
11
  BedrockProviderCard,
12
+ DeepSeekProviderCard,
8
13
  FireworksAIProviderCard,
9
14
  GithubProviderCard,
10
15
  GoogleProviderCard,
11
16
  GroqProviderCard,
12
17
  HuggingFaceProviderCard,
13
18
  HunyuanProviderCard,
19
+ MinimaxProviderCard,
20
+ MistralProviderCard,
21
+ MoonshotProviderCard,
14
22
  NovitaProviderCard,
15
23
  OllamaProviderCard,
16
24
  OpenAIProviderCard,
17
25
  OpenRouterProviderCard,
26
+ PerplexityProviderCard,
18
27
  QwenProviderCard,
28
+ SenseNovaProviderCard,
19
29
  SiliconCloudProviderCard,
30
+ SparkProviderCard,
31
+ StepfunProviderCard,
32
+ TaichuProviderCard,
20
33
  TogetherAIProviderCard,
34
+ UpstageProviderCard,
35
+ WenxinProviderCard,
21
36
  ZeroOneProviderCard,
22
37
  ZhiPuProviderCard,
23
38
  } from '@/config/modelProviders';
@@ -36,6 +51,8 @@ export const getServerGlobalConfig = () => {
36
51
  OPENAI_MODEL_LIST,
37
52
 
38
53
  ENABLED_MOONSHOT,
54
+ MOONSHOT_MODEL_LIST,
55
+
39
56
  ENABLED_ZHIPU,
40
57
  ZHIPU_MODEL_LIST,
41
58
 
@@ -55,10 +72,19 @@ export const getServerGlobalConfig = () => {
55
72
  HUNYUAN_MODEL_LIST,
56
73
 
57
74
  ENABLED_DEEPSEEK,
75
+ DEEPSEEK_MODEL_LIST,
76
+
58
77
  ENABLED_PERPLEXITY,
78
+ PERPLEXITY_MODEL_LIST,
79
+
59
80
  ENABLED_ANTHROPIC,
81
+ ANTHROPIC_MODEL_LIST,
82
+
60
83
  ENABLED_MINIMAX,
84
+ MINIMAX_MODEL_LIST,
85
+
61
86
  ENABLED_MISTRAL,
87
+ MISTRAL_MODEL_LIST,
62
88
 
63
89
  ENABLED_NOVITA,
64
90
  NOVITA_MODEL_LIST,
@@ -67,17 +93,31 @@ export const getServerGlobalConfig = () => {
67
93
  QWEN_MODEL_LIST,
68
94
 
69
95
  ENABLED_STEPFUN,
96
+ STEPFUN_MODEL_LIST,
97
+
70
98
  ENABLED_BAICHUAN,
99
+ BAICHUAN_MODEL_LIST,
100
+
71
101
  ENABLED_TAICHU,
102
+ TAICHU_MODEL_LIST,
103
+
72
104
  ENABLED_AI21,
105
+ AI21_MODEL_LIST,
106
+
73
107
  ENABLED_AI360,
108
+ AI360_MODEL_LIST,
109
+
110
+ ENABLED_SENSENOVA,
111
+ SENSENOVA_MODEL_LIST,
74
112
 
75
113
  ENABLED_SILICONCLOUD,
76
114
  SILICONCLOUD_MODEL_LIST,
77
115
 
78
116
  ENABLED_UPSTAGE,
117
+ UPSTAGE_MODEL_LIST,
79
118
 
80
119
  ENABLED_SPARK,
120
+ SPARK_MODEL_LIST,
81
121
 
82
122
  ENABLED_AZURE_OPENAI,
83
123
  AZURE_MODEL_LIST,
@@ -99,6 +139,7 @@ export const getServerGlobalConfig = () => {
99
139
  FIREWORKSAI_MODEL_LIST,
100
140
 
101
141
  ENABLED_WENXIN,
142
+ WENXIN_MODEL_LIST,
102
143
 
103
144
  ENABLED_HUGGINGFACE,
104
145
  HUGGINGFACE_MODEL_LIST,
@@ -112,10 +153,29 @@ export const getServerGlobalConfig = () => {
112
153
  enabledAccessCode: ACCESS_CODES?.length > 0,
113
154
  enabledOAuthSSO: enableNextAuth,
114
155
  languageModel: {
115
- ai21: { enabled: ENABLED_AI21 },
116
- ai360: { enabled: ENABLED_AI360 },
156
+ ai21: {
157
+ enabled: ENABLED_AI21,
158
+ enabledModels: extractEnabledModels(AI21_MODEL_LIST),
159
+ serverModelCards: transformToChatModelCards({
160
+ defaultChatModels: Ai21ProviderCard.chatModels,
161
+ modelString: AI21_MODEL_LIST,
162
+ }),
163
+ },
164
+ ai360: {
165
+ enabled: ENABLED_AI360,
166
+ enabledModels: extractEnabledModels(AI360_MODEL_LIST),
167
+ serverModelCards: transformToChatModelCards({
168
+ defaultChatModels: Ai360ProviderCard.chatModels,
169
+ modelString: AI360_MODEL_LIST,
170
+ }),
171
+ },
117
172
  anthropic: {
118
173
  enabled: ENABLED_ANTHROPIC,
174
+ enabledModels: extractEnabledModels(ANTHROPIC_MODEL_LIST),
175
+ serverModelCards: transformToChatModelCards({
176
+ defaultChatModels: AnthropicProviderCard.chatModels,
177
+ modelString: ANTHROPIC_MODEL_LIST,
178
+ }),
119
179
  },
120
180
  azure: {
121
181
  enabled: ENABLED_AZURE_OPENAI,
@@ -126,7 +186,14 @@ export const getServerGlobalConfig = () => {
126
186
  withDeploymentName: true,
127
187
  }),
128
188
  },
129
- baichuan: { enabled: ENABLED_BAICHUAN },
189
+ baichuan: {
190
+ enabled: ENABLED_BAICHUAN,
191
+ enabledModels: extractEnabledModels(BAICHUAN_MODEL_LIST),
192
+ serverModelCards: transformToChatModelCards({
193
+ defaultChatModels: BaichuanProviderCard.chatModels,
194
+ modelString: BAICHUAN_MODEL_LIST,
195
+ }),
196
+ },
130
197
  bedrock: {
131
198
  enabled: ENABLED_AWS_BEDROCK,
132
199
  enabledModels: extractEnabledModels(AWS_BEDROCK_MODEL_LIST),
@@ -135,8 +202,14 @@ export const getServerGlobalConfig = () => {
135
202
  modelString: AWS_BEDROCK_MODEL_LIST,
136
203
  }),
137
204
  },
138
- deepseek: { enabled: ENABLED_DEEPSEEK },
139
-
205
+ deepseek: {
206
+ enabled: ENABLED_DEEPSEEK,
207
+ enabledModels: extractEnabledModels(DEEPSEEK_MODEL_LIST),
208
+ serverModelCards: transformToChatModelCards({
209
+ defaultChatModels: DeepSeekProviderCard.chatModels,
210
+ modelString: DEEPSEEK_MODEL_LIST,
211
+ }),
212
+ },
140
213
  fireworksai: {
141
214
  enabled: ENABLED_FIREWORKSAI,
142
215
  enabledModels: extractEnabledModels(FIREWORKSAI_MODEL_LIST),
@@ -145,7 +218,6 @@ export const getServerGlobalConfig = () => {
145
218
  modelString: FIREWORKSAI_MODEL_LIST,
146
219
  }),
147
220
  },
148
-
149
221
  github: {
150
222
  enabled: ENABLED_GITHUB,
151
223
  enabledModels: extractEnabledModels(GITHUB_MODEL_LIST),
@@ -186,9 +258,30 @@ export const getServerGlobalConfig = () => {
186
258
  modelString: HUNYUAN_MODEL_LIST,
187
259
  }),
188
260
  },
189
- minimax: { enabled: ENABLED_MINIMAX },
190
- mistral: { enabled: ENABLED_MISTRAL },
191
- moonshot: { enabled: ENABLED_MOONSHOT },
261
+ minimax: {
262
+ enabled: ENABLED_MINIMAX,
263
+ enabledModels: extractEnabledModels(MINIMAX_MODEL_LIST),
264
+ serverModelCards: transformToChatModelCards({
265
+ defaultChatModels: MinimaxProviderCard.chatModels,
266
+ modelString: MINIMAX_MODEL_LIST,
267
+ }),
268
+ },
269
+ mistral: {
270
+ enabled: ENABLED_MISTRAL,
271
+ enabledModels: extractEnabledModels(MISTRAL_MODEL_LIST),
272
+ serverModelCards: transformToChatModelCards({
273
+ defaultChatModels: MistralProviderCard.chatModels,
274
+ modelString: MISTRAL_MODEL_LIST,
275
+ }),
276
+ },
277
+ moonshot: {
278
+ enabled: ENABLED_MOONSHOT,
279
+ enabledModels: extractEnabledModels(MOONSHOT_MODEL_LIST),
280
+ serverModelCards: transformToChatModelCards({
281
+ defaultChatModels: MoonshotProviderCard.chatModels,
282
+ modelString: MOONSHOT_MODEL_LIST,
283
+ }),
284
+ },
192
285
  novita: {
193
286
  enabled: ENABLED_NOVITA,
194
287
  enabledModels: extractEnabledModels(NOVITA_MODEL_LIST),
@@ -222,7 +315,14 @@ export const getServerGlobalConfig = () => {
222
315
  modelString: OPENROUTER_MODEL_LIST,
223
316
  }),
224
317
  },
225
- perplexity: { enabled: ENABLED_PERPLEXITY },
318
+ perplexity: {
319
+ enabled: ENABLED_PERPLEXITY,
320
+ enabledModels: extractEnabledModels(PERPLEXITY_MODEL_LIST),
321
+ serverModelCards: transformToChatModelCards({
322
+ defaultChatModels: PerplexityProviderCard.chatModels,
323
+ modelString: PERPLEXITY_MODEL_LIST,
324
+ }),
325
+ },
226
326
  qwen: {
227
327
  enabled: ENABLED_QWEN,
228
328
  enabledModels: extractEnabledModels(QWEN_MODEL_LIST),
@@ -231,6 +331,14 @@ export const getServerGlobalConfig = () => {
231
331
  modelString: QWEN_MODEL_LIST,
232
332
  }),
233
333
  },
334
+ sensenova: {
335
+ enabled: ENABLED_SENSENOVA,
336
+ enabledModels: extractEnabledModels(SENSENOVA_MODEL_LIST),
337
+ serverModelCards: transformToChatModelCards({
338
+ defaultChatModels: SenseNovaProviderCard.chatModels,
339
+ modelString: SENSENOVA_MODEL_LIST,
340
+ }),
341
+ },
234
342
  siliconcloud: {
235
343
  enabled: ENABLED_SILICONCLOUD,
236
344
  enabledModels: extractEnabledModels(SILICONCLOUD_MODEL_LIST),
@@ -239,10 +347,30 @@ export const getServerGlobalConfig = () => {
239
347
  modelString: SILICONCLOUD_MODEL_LIST,
240
348
  }),
241
349
  },
242
- spark: { enabled: ENABLED_SPARK },
243
- stepfun: { enabled: ENABLED_STEPFUN },
244
-
245
- taichu: { enabled: ENABLED_TAICHU },
350
+ spark: {
351
+ enabled: ENABLED_SPARK,
352
+ enabledModels: extractEnabledModels(SPARK_MODEL_LIST),
353
+ serverModelCards: transformToChatModelCards({
354
+ defaultChatModels: SparkProviderCard.chatModels,
355
+ modelString: SPARK_MODEL_LIST,
356
+ }),
357
+ },
358
+ stepfun: {
359
+ enabled: ENABLED_STEPFUN,
360
+ enabledModels: extractEnabledModels(STEPFUN_MODEL_LIST),
361
+ serverModelCards: transformToChatModelCards({
362
+ defaultChatModels: StepfunProviderCard.chatModels,
363
+ modelString: STEPFUN_MODEL_LIST,
364
+ }),
365
+ },
366
+ taichu: {
367
+ enabled: ENABLED_TAICHU,
368
+ enabledModels: extractEnabledModels(TAICHU_MODEL_LIST),
369
+ serverModelCards: transformToChatModelCards({
370
+ defaultChatModels: TaichuProviderCard.chatModels,
371
+ modelString: TAICHU_MODEL_LIST,
372
+ }),
373
+ },
246
374
  togetherai: {
247
375
  enabled: ENABLED_TOGETHERAI,
248
376
  enabledModels: extractEnabledModels(TOGETHERAI_MODEL_LIST),
@@ -251,8 +379,22 @@ export const getServerGlobalConfig = () => {
251
379
  modelString: TOGETHERAI_MODEL_LIST,
252
380
  }),
253
381
  },
254
- upstage: { enabled: ENABLED_UPSTAGE },
255
- wenxin: { enabled: ENABLED_WENXIN },
382
+ upstage: {
383
+ enabled: ENABLED_UPSTAGE,
384
+ enabledModels: extractEnabledModels(UPSTAGE_MODEL_LIST),
385
+ serverModelCards: transformToChatModelCards({
386
+ defaultChatModels: UpstageProviderCard.chatModels,
387
+ modelString: UPSTAGE_MODEL_LIST,
388
+ }),
389
+ },
390
+ wenxin: {
391
+ enabled: ENABLED_WENXIN,
392
+ enabledModels: extractEnabledModels(WENXIN_MODEL_LIST),
393
+ serverModelCards: transformToChatModelCards({
394
+ defaultChatModels: WenxinProviderCard.chatModels,
395
+ modelString: WENXIN_MODEL_LIST,
396
+ }),
397
+ },
256
398
  zeroone: {
257
399
  enabled: ENABLED_ZEROONE,
258
400
  enabledModels: extractEnabledModels(ZEROONE_MODEL_LIST),
@@ -261,6 +261,16 @@ const getLlmOptionsFromPayload = (provider: string, payload: JWTPayload) => {
261
261
 
262
262
  const apiKey = apiKeyManager.pick(payload?.apiKey || HUNYUAN_API_KEY);
263
263
 
264
+ return { apiKey };
265
+ }
266
+ case ModelProvider.SenseNova: {
267
+ const { SENSENOVA_ACCESS_KEY_ID, SENSENOVA_ACCESS_KEY_SECRET } = getLLMConfig();
268
+
269
+ const sensenovaAccessKeyID = apiKeyManager.pick(payload?.sensenovaAccessKeyID || SENSENOVA_ACCESS_KEY_ID);
270
+ const sensenovaAccessKeySecret = apiKeyManager.pick(payload?.sensenovaAccessKeySecret || SENSENOVA_ACCESS_KEY_SECRET);
271
+
272
+ const apiKey = sensenovaAccessKeyID + ':' + sensenovaAccessKeySecret;
273
+
264
274
  return { apiKey };
265
275
  }
266
276
  }
@@ -25,6 +25,20 @@ export const getProviderAuthPayload = (provider: string) => {
25
25
  };
26
26
  }
27
27
 
28
+ case ModelProvider.SenseNova: {
29
+ const { sensenovaAccessKeyID, sensenovaAccessKeySecret } = keyVaultsConfigSelectors.sensenovaConfig(
30
+ useUserStore.getState(),
31
+ );
32
+
33
+ const apiKey = (sensenovaAccessKeyID || '') + ':' + (sensenovaAccessKeySecret || '')
34
+
35
+ return {
36
+ apiKey,
37
+ sensenovaAccessKeyID: sensenovaAccessKeyID,
38
+ sensenovaAccessKeySecret: sensenovaAccessKeySecret,
39
+ };
40
+ }
41
+
28
42
  case ModelProvider.Wenxin: {
29
43
  const { secretKey, accessKey } = keyVaultsConfigSelectors.wenxinConfig(
30
44
  useUserStore.getState(),
@@ -16,6 +16,7 @@ const openAIConfig = (s: UserStore) => keyVaultsSettings(s).openai || {};
16
16
  const bedrockConfig = (s: UserStore) => keyVaultsSettings(s).bedrock || {};
17
17
  const wenxinConfig = (s: UserStore) => keyVaultsSettings(s).wenxin || {};
18
18
  const ollamaConfig = (s: UserStore) => keyVaultsSettings(s).ollama || {};
19
+ const sensenovaConfig = (s: UserStore) => keyVaultsSettings(s).sensenova || {};
19
20
  const azureConfig = (s: UserStore) => keyVaultsSettings(s).azure || {};
20
21
  const getVaultByProvider = (provider: GlobalLLMProviderKey) => (s: UserStore) =>
21
22
  (keyVaultsSettings(s)[provider] || {}) as OpenAICompatibleKeyVault &
@@ -43,5 +44,6 @@ export const keyVaultsConfigSelectors = {
43
44
  ollamaConfig,
44
45
  openAIConfig,
45
46
  password,
47
+ sensenovaConfig,
46
48
  wenxinConfig,
47
49
  };
@@ -69,6 +69,7 @@ const openAIConfig = (s: UserStore) => currentLLMSettings(s).openai;
69
69
  const bedrockConfig = (s: UserStore) => currentLLMSettings(s).bedrock;
70
70
  const ollamaConfig = (s: UserStore) => currentLLMSettings(s).ollama;
71
71
  const azureConfig = (s: UserStore) => currentLLMSettings(s).azure;
72
+ const sensenovaConfig = (s: UserStore) => currentLLMSettings(s).sensenova;
72
73
 
73
74
  const isAzureEnabled = (s: UserStore) => currentLLMSettings(s).azure.enabled;
74
75
 
@@ -86,4 +87,5 @@ export const modelConfigSelectors = {
86
87
 
87
88
  ollamaConfig,
88
89
  openAIConfig,
90
+ sensenovaConfig,
89
91
  };
@@ -16,6 +16,11 @@ export interface AWSBedrockKeyVault {
16
16
  sessionToken?: string;
17
17
  }
18
18
 
19
+ export interface SenseNovaKeyVault {
20
+ sensenovaAccessKeyID?: string;
21
+ sensenovaAccessKeySecret?: string;
22
+ }
23
+
19
24
  export interface WenxinKeyVault {
20
25
  accessKey?: string;
21
26
  secretKey?: string;
@@ -46,6 +51,7 @@ export interface UserKeyVaults {
46
51
  password?: string;
47
52
  perplexity?: OpenAICompatibleKeyVault;
48
53
  qwen?: OpenAICompatibleKeyVault;
54
+ sensenova?: SenseNovaKeyVault;
49
55
  siliconcloud?: OpenAICompatibleKeyVault;
50
56
  spark?: OpenAICompatibleKeyVault;
51
57
  stepfun?: OpenAICompatibleKeyVault;