@lobehub/chat 1.42.2 → 1.42.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +42 -0
- package/README.ja-JP.md +6 -6
- package/README.md +6 -6
- package/README.zh-CN.md +7 -7
- package/changelog/v1.json +14 -0
- package/locales/ar/components.json +3 -0
- package/locales/ar/modelProvider.json +0 -16
- package/locales/ar/models.json +12 -0
- package/locales/ar/setting.json +1 -2
- package/locales/bg-BG/components.json +3 -0
- package/locales/bg-BG/modelProvider.json +0 -16
- package/locales/bg-BG/models.json +12 -0
- package/locales/bg-BG/setting.json +1 -2
- package/locales/de-DE/components.json +3 -0
- package/locales/de-DE/modelProvider.json +0 -16
- package/locales/de-DE/models.json +12 -0
- package/locales/de-DE/setting.json +1 -2
- package/locales/en-US/components.json +3 -0
- package/locales/en-US/modelProvider.json +0 -16
- package/locales/en-US/models.json +12 -0
- package/locales/en-US/setting.json +1 -2
- package/locales/es-ES/components.json +3 -0
- package/locales/es-ES/modelProvider.json +0 -16
- package/locales/es-ES/models.json +12 -0
- package/locales/es-ES/setting.json +1 -2
- package/locales/fa-IR/components.json +3 -0
- package/locales/fa-IR/modelProvider.json +0 -16
- package/locales/fa-IR/models.json +12 -0
- package/locales/fa-IR/setting.json +1 -2
- package/locales/fr-FR/components.json +3 -0
- package/locales/fr-FR/modelProvider.json +0 -16
- package/locales/fr-FR/models.json +12 -0
- package/locales/fr-FR/setting.json +1 -2
- package/locales/it-IT/components.json +3 -0
- package/locales/it-IT/modelProvider.json +0 -16
- package/locales/it-IT/models.json +12 -0
- package/locales/it-IT/setting.json +1 -2
- package/locales/ja-JP/components.json +3 -0
- package/locales/ja-JP/modelProvider.json +0 -16
- package/locales/ja-JP/models.json +12 -0
- package/locales/ja-JP/setting.json +1 -2
- package/locales/ko-KR/components.json +3 -0
- package/locales/ko-KR/modelProvider.json +0 -16
- package/locales/ko-KR/models.json +12 -0
- package/locales/ko-KR/setting.json +1 -2
- package/locales/nl-NL/components.json +3 -0
- package/locales/nl-NL/modelProvider.json +0 -16
- package/locales/nl-NL/models.json +12 -0
- package/locales/nl-NL/setting.json +1 -2
- package/locales/pl-PL/components.json +3 -0
- package/locales/pl-PL/modelProvider.json +0 -16
- package/locales/pl-PL/models.json +12 -0
- package/locales/pl-PL/setting.json +1 -2
- package/locales/pt-BR/components.json +3 -0
- package/locales/pt-BR/modelProvider.json +0 -16
- package/locales/pt-BR/models.json +12 -0
- package/locales/pt-BR/setting.json +1 -2
- package/locales/ru-RU/components.json +3 -0
- package/locales/ru-RU/modelProvider.json +0 -16
- package/locales/ru-RU/models.json +12 -0
- package/locales/ru-RU/setting.json +1 -2
- package/locales/tr-TR/components.json +3 -0
- package/locales/tr-TR/modelProvider.json +0 -16
- package/locales/tr-TR/models.json +12 -0
- package/locales/tr-TR/setting.json +1 -2
- package/locales/vi-VN/components.json +3 -0
- package/locales/vi-VN/modelProvider.json +0 -16
- package/locales/vi-VN/models.json +12 -0
- package/locales/vi-VN/setting.json +1 -2
- package/locales/zh-CN/common.json +1 -1
- package/locales/zh-CN/components.json +3 -0
- package/locales/zh-CN/modelProvider.json +0 -16
- package/locales/zh-CN/models.json +12 -0
- package/locales/zh-CN/providers.json +1 -1
- package/locales/zh-CN/setting.json +1 -2
- package/locales/zh-TW/components.json +3 -0
- package/locales/zh-TW/modelProvider.json +0 -16
- package/locales/zh-TW/models.json +12 -0
- package/locales/zh-TW/setting.json +1 -2
- package/package.json +3 -3
- package/src/app/(main)/settings/_layout/Desktop/SideBar.tsx +5 -1
- package/src/config/modelProviders/ai21.ts +4 -0
- package/src/config/modelProviders/ai360.ts +5 -0
- package/src/config/modelProviders/anthropic.ts +11 -0
- package/src/config/modelProviders/azure.ts +4 -0
- package/src/config/modelProviders/baichuan.ts +8 -0
- package/src/config/modelProviders/bedrock.ts +1 -0
- package/src/config/modelProviders/cloudflare.ts +5 -0
- package/src/config/modelProviders/deepseek.ts +4 -0
- package/src/config/modelProviders/fireworksai.ts +4 -0
- package/src/config/modelProviders/giteeai.ts +5 -0
- package/src/config/modelProviders/github.ts +6 -1
- package/src/config/modelProviders/google.ts +10 -0
- package/src/config/modelProviders/groq.ts +7 -0
- package/src/config/modelProviders/higress.ts +9 -0
- package/src/config/modelProviders/huggingface.ts +5 -0
- package/src/config/modelProviders/hunyuan.ts +5 -0
- package/src/config/modelProviders/internlm.ts +5 -0
- package/src/config/modelProviders/minimax.ts +7 -0
- package/src/config/modelProviders/mistral.ts +3 -0
- package/src/config/modelProviders/moonshot.ts +10 -0
- package/src/config/modelProviders/novita.ts +5 -0
- package/src/config/modelProviders/ollama.ts +6 -8
- package/src/config/modelProviders/openai.ts +5 -2
- package/src/config/modelProviders/openrouter.ts +5 -1
- package/src/config/modelProviders/perplexity.ts +6 -0
- package/src/config/modelProviders/qwen.ts +12 -0
- package/src/config/modelProviders/sensenova.ts +5 -0
- package/src/config/modelProviders/siliconcloud.ts +7 -0
- package/src/config/modelProviders/spark.ts +8 -0
- package/src/config/modelProviders/stepfun.ts +9 -0
- package/src/config/modelProviders/taichu.ts +4 -0
- package/src/config/modelProviders/togetherai.ts +4 -0
- package/src/config/modelProviders/upstage.ts +4 -0
- package/src/config/modelProviders/wenxin.ts +8 -0
- package/src/config/modelProviders/xai.ts +7 -0
- package/src/config/modelProviders/zeroone.ts +1 -0
- package/src/config/modelProviders/zhipu.ts +1 -0
- package/src/features/ModelSelect/index.tsx +6 -8
- package/src/features/ModelSwitchPanel/index.tsx +6 -8
- package/src/hooks/useEnabledChatModels.ts +9 -0
- package/src/store/user/slices/modelList/selectors/modelProvider.ts +13 -2
- package/src/types/aiModel.ts +15 -0
- package/src/types/aiProvider.ts +70 -16
- package/src/types/llm.ts +18 -3
@@ -277,6 +277,16 @@ const Google: ModelProviderCard = {
|
|
277
277
|
proxyUrl: {
|
278
278
|
placeholder: 'https://generativelanguage.googleapis.com',
|
279
279
|
},
|
280
|
+
settings: {
|
281
|
+
proxyUrl: {
|
282
|
+
placeholder: 'https://generativelanguage.googleapis.com',
|
283
|
+
},
|
284
|
+
sdkType: 'google',
|
285
|
+
smoothing: {
|
286
|
+
speed: 2,
|
287
|
+
text: true,
|
288
|
+
},
|
289
|
+
},
|
280
290
|
smoothing: {
|
281
291
|
speed: 2,
|
282
292
|
text: true,
|
@@ -179,6 +179,13 @@ const Groq: ModelProviderCard = {
|
|
179
179
|
proxyUrl: {
|
180
180
|
placeholder: 'https://api.groq.com/openai/v1',
|
181
181
|
},
|
182
|
+
settings: {
|
183
|
+
proxyUrl: {
|
184
|
+
placeholder: 'https://api.groq.com/openai/v1',
|
185
|
+
},
|
186
|
+
sdkType: 'openai',
|
187
|
+
showModelFetcher: true,
|
188
|
+
},
|
182
189
|
url: 'https://groq.com',
|
183
190
|
};
|
184
191
|
|
@@ -2476,6 +2476,15 @@ const Higress: ModelProviderCard = {
|
|
2476
2476
|
placeholder: 'https://127.0.0.1:8080/v1',
|
2477
2477
|
title: 'AI Gateway地址',
|
2478
2478
|
},
|
2479
|
+
settings: {
|
2480
|
+
proxyUrl: {
|
2481
|
+
desc: '输入Higress AI Gateway的访问地址',
|
2482
|
+
placeholder: 'https://127.0.0.1:8080/v1',
|
2483
|
+
title: 'AI Gateway地址',
|
2484
|
+
},
|
2485
|
+
sdkType: 'openai',
|
2486
|
+
showModelFetcher: true,
|
2487
|
+
},
|
2479
2488
|
url: 'https://apig.console.aliyun.com/',
|
2480
2489
|
};
|
2481
2490
|
|
@@ -52,6 +52,11 @@ const HuggingFace: ModelProviderCard = {
|
|
52
52
|
modelList: { showModelFetcher: true },
|
53
53
|
modelsUrl: 'https://huggingface.co/docs/api-inference/en/supported-models',
|
54
54
|
name: 'HuggingFace',
|
55
|
+
settings: {
|
56
|
+
disableBrowserRequest: true,
|
57
|
+
sdkType: 'huggingface',
|
58
|
+
showModelFetcher: true,
|
59
|
+
},
|
55
60
|
url: 'https://huggingface.co',
|
56
61
|
};
|
57
62
|
|
@@ -138,6 +138,11 @@ const Hunyuan: ModelProviderCard = {
|
|
138
138
|
modelList: { showModelFetcher: true },
|
139
139
|
modelsUrl: 'https://cloud.tencent.com/document/product/1729/104753',
|
140
140
|
name: 'Hunyuan',
|
141
|
+
settings: {
|
142
|
+
disableBrowserRequest: true,
|
143
|
+
sdkType: 'openai',
|
144
|
+
showModelFetcher: true,
|
145
|
+
},
|
141
146
|
url: 'https://hunyuan.tencent.com',
|
142
147
|
};
|
143
148
|
|
@@ -38,6 +38,11 @@ const InternLM: ModelProviderCard = {
|
|
38
38
|
modelsUrl:
|
39
39
|
'https://internlm.intern-ai.org.cn/doc/docs/Models#%E8%8E%B7%E5%8F%96%E6%A8%A1%E5%9E%8B%E5%88%97%E8%A1%A8',
|
40
40
|
name: 'InternLM',
|
41
|
+
settings: {
|
42
|
+
disableBrowserRequest: true,
|
43
|
+
sdkType: 'openai',
|
44
|
+
showModelFetcher: true,
|
45
|
+
},
|
41
46
|
url: 'https://internlm.intern-ai.org.cn',
|
42
47
|
};
|
43
48
|
|
@@ -46,6 +46,13 @@ const Minimax: ModelProviderCard = {
|
|
46
46
|
id: 'minimax',
|
47
47
|
modelsUrl: 'https://platform.minimaxi.com/document/Models',
|
48
48
|
name: 'Minimax',
|
49
|
+
settings: {
|
50
|
+
sdkType: 'openai',
|
51
|
+
smoothing: {
|
52
|
+
speed: 2,
|
53
|
+
text: true,
|
54
|
+
},
|
55
|
+
},
|
49
56
|
smoothing: {
|
50
57
|
speed: 2,
|
51
58
|
text: true,
|
@@ -40,6 +40,16 @@ const Moonshot: ModelProviderCard = {
|
|
40
40
|
proxyUrl: {
|
41
41
|
placeholder: 'https://api.moonshot.cn/v1',
|
42
42
|
},
|
43
|
+
settings: {
|
44
|
+
proxyUrl: {
|
45
|
+
placeholder: 'https://api.moonshot.cn/v1',
|
46
|
+
},
|
47
|
+
sdkType: 'openai',
|
48
|
+
smoothing: {
|
49
|
+
speed: 2,
|
50
|
+
text: true,
|
51
|
+
},
|
52
|
+
},
|
43
53
|
smoothing: {
|
44
54
|
speed: 2,
|
45
55
|
text: true,
|
@@ -115,6 +115,11 @@ const Novita: ModelProviderCard = {
|
|
115
115
|
modelList: { showModelFetcher: true },
|
116
116
|
modelsUrl: 'https://novita.ai/model-api/product/llm-api',
|
117
117
|
name: 'Novita',
|
118
|
+
settings: {
|
119
|
+
disableBrowserRequest: true,
|
120
|
+
sdkType: 'openai',
|
121
|
+
showModelFetcher: true,
|
122
|
+
},
|
118
123
|
url: 'https://novita.ai',
|
119
124
|
};
|
120
125
|
|
@@ -89,14 +89,6 @@ const Ollama: ModelProviderCard = {
|
|
89
89
|
displayName: 'Qwen2.5 72B',
|
90
90
|
id: 'qwen2.5:72b',
|
91
91
|
},
|
92
|
-
{
|
93
|
-
contextWindowTokens: 128_000,
|
94
|
-
description: 'Qwen2.5 是阿里巴巴的新一代大规模语言模型,以优异的性能支持多元化的应用需求。',
|
95
|
-
displayName: 'Qwen2.5 7B',
|
96
|
-
enabled: true,
|
97
|
-
functionCall: true,
|
98
|
-
id: 'qwen2.5',
|
99
|
-
},
|
100
92
|
{
|
101
93
|
contextWindowTokens: 65_536,
|
102
94
|
description: 'CodeQwen1.5 是基于大量代码数据训练的大型语言模型,专为解决复杂编程任务。',
|
@@ -341,6 +333,12 @@ const Ollama: ModelProviderCard = {
|
|
341
333
|
modelList: { showModelFetcher: true },
|
342
334
|
modelsUrl: 'https://ollama.com/library',
|
343
335
|
name: 'Ollama',
|
336
|
+
settings: {
|
337
|
+
disableBrowserRequest: true,
|
338
|
+
sdkType: 'ollama',
|
339
|
+
showApiKey: false,
|
340
|
+
showModelFetcher: true,
|
341
|
+
},
|
344
342
|
showApiKey: false,
|
345
343
|
url: 'https://ollama.com',
|
346
344
|
};
|
@@ -29,9 +29,9 @@ const OpenAI: ModelProviderCard = {
|
|
29
29
|
input: 15,
|
30
30
|
output: 60,
|
31
31
|
},
|
32
|
-
releasedAt: '2024-12-17',
|
32
|
+
releasedAt: '2024-12-17',
|
33
33
|
vision: true,
|
34
|
-
},
|
34
|
+
},
|
35
35
|
{
|
36
36
|
contextWindowTokens: 128_000,
|
37
37
|
description:
|
@@ -299,6 +299,9 @@ const OpenAI: ModelProviderCard = {
|
|
299
299
|
modelList: { showModelFetcher: true },
|
300
300
|
modelsUrl: 'https://platform.openai.com/docs/models',
|
301
301
|
name: 'OpenAI',
|
302
|
+
settings: {
|
303
|
+
showModelFetcher: true,
|
304
|
+
},
|
302
305
|
url: 'https://openai.com',
|
303
306
|
};
|
304
307
|
|
@@ -41,7 +41,7 @@ const OpenRouter: ModelProviderCard = {
|
|
41
41
|
},
|
42
42
|
releasedAt: '2024-12-17',
|
43
43
|
vision: true,
|
44
|
-
},
|
44
|
+
},
|
45
45
|
{
|
46
46
|
contextWindowTokens: 128_000,
|
47
47
|
description:
|
@@ -236,6 +236,10 @@ const OpenRouter: ModelProviderCard = {
|
|
236
236
|
modelList: { showModelFetcher: true },
|
237
237
|
modelsUrl: 'https://openrouter.ai/models',
|
238
238
|
name: 'OpenRouter',
|
239
|
+
settings: {
|
240
|
+
sdkType: 'openai',
|
241
|
+
showModelFetcher: true,
|
242
|
+
},
|
239
243
|
url: 'https://openrouter.ai',
|
240
244
|
};
|
241
245
|
|
@@ -65,6 +65,12 @@ const Perplexity: ModelProviderCard = {
|
|
65
65
|
proxyUrl: {
|
66
66
|
placeholder: 'https://api.perplexity.ai',
|
67
67
|
},
|
68
|
+
settings: {
|
69
|
+
proxyUrl: {
|
70
|
+
placeholder: 'https://api.perplexity.ai',
|
71
|
+
},
|
72
|
+
sdkType: 'openai',
|
73
|
+
},
|
68
74
|
url: 'https://www.perplexity.ai',
|
69
75
|
};
|
70
76
|
|
@@ -266,6 +266,18 @@ const Qwen: ModelProviderCard = {
|
|
266
266
|
proxyUrl: {
|
267
267
|
placeholder: 'https://dashscope.aliyuncs.com/compatible-mode/v1',
|
268
268
|
},
|
269
|
+
settings: {
|
270
|
+
disableBrowserRequest: true,
|
271
|
+
proxyUrl: {
|
272
|
+
placeholder: 'https://dashscope.aliyuncs.com/compatible-mode/v1',
|
273
|
+
},
|
274
|
+
sdkType: 'openai',
|
275
|
+
showModelFetcher: true,
|
276
|
+
smoothing: {
|
277
|
+
speed: 2,
|
278
|
+
text: true,
|
279
|
+
},
|
280
|
+
},
|
269
281
|
smoothing: {
|
270
282
|
speed: 2,
|
271
283
|
text: true,
|
@@ -124,6 +124,11 @@ const SenseNova: ModelProviderCard = {
|
|
124
124
|
modelList: { showModelFetcher: true },
|
125
125
|
modelsUrl: 'https://platform.sensenova.cn/pricing',
|
126
126
|
name: 'SenseNova',
|
127
|
+
settings: {
|
128
|
+
disableBrowserRequest: true,
|
129
|
+
sdkType: 'openai',
|
130
|
+
showModelFetcher: true,
|
131
|
+
},
|
127
132
|
url: 'https://platform.sensenova.cn/home',
|
128
133
|
};
|
129
134
|
|
@@ -598,6 +598,13 @@ const SiliconCloud: ModelProviderCard = {
|
|
598
598
|
proxyUrl: {
|
599
599
|
placeholder: 'https://api.siliconflow.cn/v1',
|
600
600
|
},
|
601
|
+
settings: {
|
602
|
+
proxyUrl: {
|
603
|
+
placeholder: 'https://api.siliconflow.cn/v1',
|
604
|
+
},
|
605
|
+
sdkType: 'openai',
|
606
|
+
showModelFetcher: true,
|
607
|
+
},
|
601
608
|
url: 'https://siliconflow.cn/zh-cn/siliconcloud',
|
602
609
|
};
|
603
610
|
|
@@ -69,6 +69,14 @@ const Spark: ModelProviderCard = {
|
|
69
69
|
modelList: { showModelFetcher: true },
|
70
70
|
modelsUrl: 'https://xinghuo.xfyun.cn/spark',
|
71
71
|
name: 'Spark',
|
72
|
+
settings: {
|
73
|
+
sdkType: 'openai',
|
74
|
+
showModelFetcher: true,
|
75
|
+
smoothing: {
|
76
|
+
speed: 2,
|
77
|
+
text: true,
|
78
|
+
},
|
79
|
+
},
|
72
80
|
smoothing: {
|
73
81
|
speed: 2,
|
74
82
|
text: true,
|
@@ -133,6 +133,15 @@ const Stepfun: ModelProviderCard = {
|
|
133
133
|
modelList: { showModelFetcher: true },
|
134
134
|
modelsUrl: 'https://platform.stepfun.com/docs/llm/text',
|
135
135
|
name: 'Stepfun',
|
136
|
+
settings: {
|
137
|
+
disableBrowserRequest: true,
|
138
|
+
sdkType: 'openai',
|
139
|
+
showModelFetcher: true,
|
140
|
+
smoothing: {
|
141
|
+
speed: 2,
|
142
|
+
text: true,
|
143
|
+
},
|
144
|
+
},
|
136
145
|
smoothing: {
|
137
146
|
speed: 2,
|
138
147
|
text: true,
|
@@ -30,6 +30,10 @@ const Taichu: ModelProviderCard = {
|
|
30
30
|
modelList: { showModelFetcher: true },
|
31
31
|
modelsUrl: 'https://ai-maas.wair.ac.cn/#/doc',
|
32
32
|
name: 'Taichu',
|
33
|
+
settings: {
|
34
|
+
sdkType: 'openai',
|
35
|
+
showModelFetcher: true,
|
36
|
+
},
|
33
37
|
url: 'https://ai-maas.wair.ac.cn',
|
34
38
|
};
|
35
39
|
|
@@ -284,6 +284,10 @@ const TogetherAI: ModelProviderCard = {
|
|
284
284
|
modelList: { showModelFetcher: true },
|
285
285
|
modelsUrl: 'https://docs.together.ai/docs/chat-models',
|
286
286
|
name: 'Together AI',
|
287
|
+
settings: {
|
288
|
+
sdkType: 'openai',
|
289
|
+
showModelFetcher: true,
|
290
|
+
},
|
287
291
|
url: 'https://www.together.ai',
|
288
292
|
};
|
289
293
|
|
@@ -37,6 +37,10 @@ const Upstage: ModelProviderCard = {
|
|
37
37
|
modelList: { showModelFetcher: true },
|
38
38
|
modelsUrl: 'https://developers.upstage.ai/docs/getting-started/models',
|
39
39
|
name: 'Upstage',
|
40
|
+
settings: {
|
41
|
+
sdkType: 'openai',
|
42
|
+
showModelFetcher: true,
|
43
|
+
},
|
40
44
|
url: 'https://upstage.ai',
|
41
45
|
};
|
42
46
|
|
@@ -162,6 +162,14 @@ const BaiduWenxin: ModelProviderCard = {
|
|
162
162
|
id: 'wenxin',
|
163
163
|
modelsUrl: 'https://cloud.baidu.com/doc/WENXINWORKSHOP/s/Nlks5zkzu#%E5%AF%B9%E8%AF%9Dchat',
|
164
164
|
name: 'Wenxin',
|
165
|
+
settings: {
|
166
|
+
disableBrowserRequest: true,
|
167
|
+
sdkType: 'wenxin',
|
168
|
+
smoothing: {
|
169
|
+
speed: 2,
|
170
|
+
text: true,
|
171
|
+
},
|
172
|
+
},
|
165
173
|
smoothing: {
|
166
174
|
speed: 2,
|
167
175
|
text: true,
|
@@ -66,6 +66,13 @@ const XAI: ModelProviderCard = {
|
|
66
66
|
proxyUrl: {
|
67
67
|
placeholder: 'https://api.x.ai/v1',
|
68
68
|
},
|
69
|
+
settings: {
|
70
|
+
proxyUrl: {
|
71
|
+
placeholder: 'https://api.x.ai/v1',
|
72
|
+
},
|
73
|
+
sdkType: 'openai',
|
74
|
+
showModelFetcher: true,
|
75
|
+
},
|
69
76
|
url: 'https://x.ai/api',
|
70
77
|
};
|
71
78
|
|
@@ -1,12 +1,10 @@
|
|
1
1
|
import { Select, SelectProps } from 'antd';
|
2
2
|
import { createStyles } from 'antd-style';
|
3
|
-
import isEqual from 'fast-deep-equal';
|
4
3
|
import { memo, useMemo } from 'react';
|
5
4
|
|
6
5
|
import { ModelItemRender, ProviderItemRender } from '@/components/ModelSelect';
|
7
|
-
import {
|
8
|
-
import {
|
9
|
-
import { ModelProviderCard } from '@/types/llm';
|
6
|
+
import { useEnabledChatModels } from '@/hooks/useEnabledChatModels';
|
7
|
+
import { EnabledProviderWithModels } from '@/types/aiModel';
|
10
8
|
|
11
9
|
const useStyles = createStyles(({ css, prefixCls }) => ({
|
12
10
|
select: css`
|
@@ -29,14 +27,14 @@ interface ModelSelectProps {
|
|
29
27
|
}
|
30
28
|
|
31
29
|
const ModelSelect = memo<ModelSelectProps>(({ value, onChange, showAbility = true }) => {
|
32
|
-
const enabledList =
|
30
|
+
const enabledList = useEnabledChatModels();
|
33
31
|
|
34
32
|
const { styles } = useStyles();
|
35
33
|
|
36
34
|
const options = useMemo<SelectProps['options']>(() => {
|
37
|
-
const getChatModels = (provider:
|
38
|
-
provider.
|
39
|
-
label: <ModelItemRender {...model} showInfoTag={showAbility} />,
|
35
|
+
const getChatModels = (provider: EnabledProviderWithModels) =>
|
36
|
+
provider.children.map((model) => ({
|
37
|
+
label: <ModelItemRender {...model} {...model.abilities} showInfoTag={showAbility} />,
|
40
38
|
provider: provider.id,
|
41
39
|
value: `${provider.id}/${model.id}`,
|
42
40
|
}));
|
@@ -2,7 +2,6 @@ import { Icon } from '@lobehub/ui';
|
|
2
2
|
import { Dropdown } from 'antd';
|
3
3
|
import { createStyles } from 'antd-style';
|
4
4
|
import type { ItemType } from 'antd/es/menu/interface';
|
5
|
-
import isEqual from 'fast-deep-equal';
|
6
5
|
import { LucideArrowRight } from 'lucide-react';
|
7
6
|
import { useRouter } from 'next/navigation';
|
8
7
|
import { PropsWithChildren, memo, useMemo } from 'react';
|
@@ -10,12 +9,11 @@ import { useTranslation } from 'react-i18next';
|
|
10
9
|
import { Flexbox } from 'react-layout-kit';
|
11
10
|
|
12
11
|
import { ModelItemRender, ProviderItemRender } from '@/components/ModelSelect';
|
12
|
+
import { useEnabledChatModels } from '@/hooks/useEnabledChatModels';
|
13
13
|
import { useIsMobile } from '@/hooks/useIsMobile';
|
14
14
|
import { useAgentStore } from '@/store/agent';
|
15
15
|
import { agentSelectors } from '@/store/agent/slices/chat';
|
16
|
-
import {
|
17
|
-
import { modelProviderSelectors } from '@/store/user/selectors';
|
18
|
-
import { ModelProviderCard } from '@/types/llm';
|
16
|
+
import { EnabledProviderWithModels } from '@/types/aiModel';
|
19
17
|
import { withBasePath } from '@/utils/basePath';
|
20
18
|
|
21
19
|
const useStyles = createStyles(({ css, prefixCls }) => ({
|
@@ -54,13 +52,13 @@ const ModelSwitchPanel = memo<PropsWithChildren>(({ children }) => {
|
|
54
52
|
|
55
53
|
const router = useRouter();
|
56
54
|
|
57
|
-
const enabledList =
|
55
|
+
const enabledList = useEnabledChatModels();
|
58
56
|
|
59
57
|
const items = useMemo<ItemType[]>(() => {
|
60
|
-
const getModelItems = (provider:
|
61
|
-
const items = provider.
|
58
|
+
const getModelItems = (provider: EnabledProviderWithModels) => {
|
59
|
+
const items = provider.children.map((model) => ({
|
62
60
|
key: menuKey(provider.id, model.id),
|
63
|
-
label: <ModelItemRender {...model} />,
|
61
|
+
label: <ModelItemRender {...model} {...model.abilities} />,
|
64
62
|
onClick: () => {
|
65
63
|
updateAgentConfig({ model: model.id, provider: provider.id });
|
66
64
|
},
|
@@ -0,0 +1,9 @@
|
|
1
|
+
import isEqual from 'fast-deep-equal';
|
2
|
+
|
3
|
+
import { useUserStore } from '@/store/user';
|
4
|
+
import { modelProviderSelectors } from '@/store/user/selectors';
|
5
|
+
import { EnabledProviderWithModels } from '@/types/aiModel';
|
6
|
+
|
7
|
+
export const useEnabledChatModels = (): EnabledProviderWithModels[] => {
|
8
|
+
return useUserStore(modelProviderSelectors.modelProviderListForModelSelect, isEqual);
|
9
|
+
};
|
@@ -1,6 +1,7 @@
|
|
1
1
|
import { uniqBy } from 'lodash-es';
|
2
2
|
|
3
3
|
import { filterEnabledModels } from '@/config/modelProviders';
|
4
|
+
import { EnabledProviderWithModels } from '@/types/aiModel';
|
4
5
|
import { ChatModelCard, ModelProviderCard } from '@/types/llm';
|
5
6
|
import { ServerModelProviderConfig } from '@/types/serverConfig';
|
6
7
|
import { GlobalLLMProviderKey } from '@/types/user/settings';
|
@@ -88,12 +89,22 @@ const getEnableModelsById = (provider: string) => (s: UserStore) => {
|
|
88
89
|
|
89
90
|
const modelProviderList = (s: UserStore): ModelProviderCard[] => s.modelProviderList;
|
90
91
|
|
91
|
-
const modelProviderListForModelSelect = (s: UserStore):
|
92
|
+
const modelProviderListForModelSelect = (s: UserStore): EnabledProviderWithModels[] =>
|
92
93
|
modelProviderList(s)
|
93
94
|
.filter((s) => s.enabled)
|
94
95
|
.map((provider) => ({
|
95
96
|
...provider,
|
96
|
-
|
97
|
+
children: provider.chatModels
|
98
|
+
.filter((model) => model.enabled)
|
99
|
+
.map((m) => ({
|
100
|
+
abilities: {
|
101
|
+
functionCall: m.functionCall,
|
102
|
+
vision: m.vision,
|
103
|
+
},
|
104
|
+
contextWindowTokens: m.contextWindowTokens,
|
105
|
+
displayName: m.displayName,
|
106
|
+
id: m.id,
|
107
|
+
})),
|
97
108
|
}));
|
98
109
|
|
99
110
|
const getModelCardById = (id: string) => (s: UserStore) => {
|
package/src/types/aiModel.ts
CHANGED
@@ -273,3 +273,18 @@ export const ToggleAiModelEnableSchema = z.object({
|
|
273
273
|
});
|
274
274
|
|
275
275
|
export type ToggleAiModelEnableParams = z.infer<typeof ToggleAiModelEnableSchema>;
|
276
|
+
|
277
|
+
//
|
278
|
+
|
279
|
+
interface AiModelForSelect {
|
280
|
+
abilities: ModelAbilities;
|
281
|
+
contextWindowTokens?: number;
|
282
|
+
displayName?: string;
|
283
|
+
id: string;
|
284
|
+
}
|
285
|
+
|
286
|
+
export interface EnabledProviderWithModels {
|
287
|
+
children: AiModelForSelect[];
|
288
|
+
id: string;
|
289
|
+
name: string;
|
290
|
+
}
|