@lobehub/chat 1.42.3 → 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.
Files changed (49) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/README.zh-CN.md +1 -1
  3. package/changelog/v1.json +9 -0
  4. package/package.json +2 -2
  5. package/src/app/(main)/settings/_layout/Desktop/SideBar.tsx +5 -1
  6. package/src/config/modelProviders/ai21.ts +4 -0
  7. package/src/config/modelProviders/ai360.ts +5 -0
  8. package/src/config/modelProviders/anthropic.ts +11 -0
  9. package/src/config/modelProviders/azure.ts +4 -0
  10. package/src/config/modelProviders/baichuan.ts +8 -0
  11. package/src/config/modelProviders/bedrock.ts +1 -0
  12. package/src/config/modelProviders/cloudflare.ts +5 -0
  13. package/src/config/modelProviders/deepseek.ts +4 -0
  14. package/src/config/modelProviders/fireworksai.ts +4 -0
  15. package/src/config/modelProviders/giteeai.ts +5 -0
  16. package/src/config/modelProviders/github.ts +6 -1
  17. package/src/config/modelProviders/google.ts +10 -0
  18. package/src/config/modelProviders/groq.ts +7 -0
  19. package/src/config/modelProviders/higress.ts +9 -0
  20. package/src/config/modelProviders/huggingface.ts +5 -0
  21. package/src/config/modelProviders/hunyuan.ts +5 -0
  22. package/src/config/modelProviders/internlm.ts +5 -0
  23. package/src/config/modelProviders/minimax.ts +7 -0
  24. package/src/config/modelProviders/mistral.ts +3 -0
  25. package/src/config/modelProviders/moonshot.ts +10 -0
  26. package/src/config/modelProviders/novita.ts +5 -0
  27. package/src/config/modelProviders/ollama.ts +6 -8
  28. package/src/config/modelProviders/openai.ts +3 -0
  29. package/src/config/modelProviders/openrouter.ts +5 -1
  30. package/src/config/modelProviders/perplexity.ts +6 -0
  31. package/src/config/modelProviders/qwen.ts +12 -0
  32. package/src/config/modelProviders/sensenova.ts +5 -0
  33. package/src/config/modelProviders/siliconcloud.ts +7 -0
  34. package/src/config/modelProviders/spark.ts +8 -0
  35. package/src/config/modelProviders/stepfun.ts +9 -0
  36. package/src/config/modelProviders/taichu.ts +4 -0
  37. package/src/config/modelProviders/togetherai.ts +4 -0
  38. package/src/config/modelProviders/upstage.ts +4 -0
  39. package/src/config/modelProviders/wenxin.ts +8 -0
  40. package/src/config/modelProviders/xai.ts +7 -0
  41. package/src/config/modelProviders/zeroone.ts +1 -0
  42. package/src/config/modelProviders/zhipu.ts +1 -0
  43. package/src/features/ModelSelect/index.tsx +6 -8
  44. package/src/features/ModelSwitchPanel/index.tsx +6 -8
  45. package/src/hooks/useEnabledChatModels.ts +9 -0
  46. package/src/store/user/slices/modelList/selectors/modelProvider.ts +13 -2
  47. package/src/types/aiModel.ts +15 -0
  48. package/src/types/aiProvider.ts +70 -16
  49. package/src/types/llm.ts +18 -3
package/CHANGELOG.md CHANGED
@@ -2,6 +2,31 @@
2
2
 
3
3
  # Changelog
4
4
 
5
+ ### [Version 1.42.4](https://github.com/lobehub/lobe-chat/compare/v1.42.3...v1.42.4)
6
+
7
+ <sup>Released on **2025-01-02**</sup>
8
+
9
+ #### ♻ Code Refactoring
10
+
11
+ - **misc**: Refactor provider info and improve settings side bar loading.
12
+
13
+ <br/>
14
+
15
+ <details>
16
+ <summary><kbd>Improvements and Fixes</kbd></summary>
17
+
18
+ #### Code refactoring
19
+
20
+ - **misc**: Refactor provider info and improve settings side bar loading, closes [#5268](https://github.com/lobehub/lobe-chat/issues/5268) ([b82a41e](https://github.com/lobehub/lobe-chat/commit/b82a41e))
21
+
22
+ </details>
23
+
24
+ <div align="right">
25
+
26
+ [![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
27
+
28
+ </div>
29
+
5
30
  ### [Version 1.42.3](https://github.com/lobehub/lobe-chat/compare/v1.42.2...v1.42.3)
6
31
 
7
32
  <sup>Released on **2025-01-01**</sup>
package/README.zh-CN.md CHANGED
@@ -148,7 +148,7 @@ LobeChat 支持文件上传与知识库功能,你可以上传文件、图片
148
148
  - **[Anthropic](https://lobechat.com/discover/provider/anthropic)**: Anthropic 是一家专注于人工智能研究和开发的公司,提供了一系列先进的语言模型,如 Claude 3.5 Sonnet、Claude 3 Sonnet、Claude 3 Opus 和 Claude 3 Haiku。这些模型在智能、速度和成本之间取得了理想的平衡,适用于从企业级工作负载到快速响应的各种应用场景。Claude 3.5 Sonnet 作为其最新模型,在多项评估中表现优异,同时保持了较高的性价比。
149
149
  - **[Bedrock](https://lobechat.com/discover/provider/bedrock)**: Bedrock 是亚马逊 AWS 提供的一项服务,专注于为企业提供先进的 AI 语言模型和视觉模型。其模型家族包括 Anthropic 的 Claude 系列、Meta 的 Llama 3.1 系列等,涵盖从轻量级到高性能的多种选择,支持文本生成、对话、图像处理等多种任务,适用于不同规模和需求的企业应用。
150
150
  - **[Google](https://lobechat.com/discover/provider/google)**: Google 的 Gemini 系列是其最先进、通用的 AI 模型,由 Google DeepMind 打造,专为多模态设计,支持文本、代码、图像、音频和视频的无缝理解与处理。适用于从数据中心到移动设备的多种环境,极大提升了 AI 模型的效率与应用广泛性。
151
- - **[DeepSeek](https://lobechat.com/discover/provider/deepseek)**: DeepSeek 是一家专注于人工智能技术研究和应用的公司,其最新模型 DeepSeek-V2.5 融合了通用对话和代码处理能力,并在人类偏好对齐、写作任务和指令跟随等方面实现了显著提升。
151
+ - **[DeepSeek](https://lobechat.com/discover/provider/deepseek)**: DeepSeek 是一家专注于人工智能技术研究和应用的公司,其最新模型 DeepSeek-V3 多项评测成绩超越 Qwen2.5-72B 和 Llama-3.1-405B 等开源模型,性能对齐领军闭源模型 GPT-4o 与 Claude-3.5-Sonnet。
152
152
  - **[HuggingFace](https://lobechat.com/discover/provider/huggingface)**: HuggingFace Inference API 提供了一种快速且免费的方式,让您可以探索成千上万种模型,适用于各种任务。无论您是在为新应用程序进行原型设计,还是在尝试机器学习的功能,这个 API 都能让您即时访问多个领域的高性能模型。
153
153
  - **[OpenRouter](https://lobechat.com/discover/provider/openrouter)**: OpenRouter 是一个提供多种前沿大模型接口的服务平台,支持 OpenAI、Anthropic、LLaMA 及更多,适合多样化的开发和应用需求。用户可根据自身需求灵活选择最优的模型和价格,助力 AI 体验的提升。
154
154
  - **[Cloudflare Workers AI](https://lobechat.com/discover/provider/cloudflare)**: 在 Cloudflare 的全球网络上运行由无服务器 GPU 驱动的机器学习模型。
package/changelog/v1.json CHANGED
@@ -1,4 +1,13 @@
1
1
  [
2
+ {
3
+ "children": {
4
+ "improvements": [
5
+ "Refactor provider info and improve settings side bar loading."
6
+ ]
7
+ },
8
+ "date": "2025-01-02",
9
+ "version": "1.42.4"
10
+ },
2
11
  {
3
12
  "children": {},
4
13
  "date": "2025-01-01",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lobehub/chat",
3
- "version": "1.42.3",
3
+ "version": "1.42.4",
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",
@@ -129,7 +129,7 @@
129
129
  "@lobehub/chat-plugins-gateway": "^1.9.0",
130
130
  "@lobehub/icons": "^1.56.0",
131
131
  "@lobehub/tts": "^1.25.1",
132
- "@lobehub/ui": "^1.155.7",
132
+ "@lobehub/ui": "^1.155.8",
133
133
  "@neondatabase/serverless": "^0.10.1",
134
134
  "@next/third-parties": "^15.0.0",
135
135
  "@react-spring/web": "^9.7.5",
@@ -1,10 +1,12 @@
1
1
  'use client';
2
2
 
3
3
  import { createStyles } from 'antd-style';
4
+ import { Suspense } from 'react';
4
5
  import { useTranslation } from 'react-i18next';
5
6
  import { Flexbox, FlexboxProps } from 'react-layout-kit';
6
7
 
7
8
  import BrandWatermark from '@/components/BrandWatermark';
9
+ import CircleLoading from '@/components/Loading/CircleLoading';
8
10
  import PanelTitle from '@/components/PanelTitle';
9
11
 
10
12
  const useStyles = createStyles(({ token, css }) => ({
@@ -33,7 +35,9 @@ const SidebarLayout = ({ children, className, title, desc, ...rest }: SidebarLay
33
35
  {...rest}
34
36
  >
35
37
  <PanelTitle desc={desc || t('header.desc')} title={title || t('header.title')} />
36
- <Flexbox flex={1}>{children}</Flexbox>
38
+ <Flexbox flex={1}>
39
+ <Suspense fallback={<CircleLoading />}>{children}</Suspense>
40
+ </Flexbox>
37
41
  <BrandWatermark paddingInline={12} />
38
42
  </Flexbox>
39
43
  );
@@ -32,6 +32,10 @@ const Ai21: ModelProviderCard = {
32
32
  modelList: { showModelFetcher: true },
33
33
  modelsUrl: 'https://docs.ai21.com/reference',
34
34
  name: 'Ai21Labs',
35
+ settings: {
36
+ sdkType: 'openai',
37
+ showModelFetcher: true,
38
+ },
35
39
  url: 'https://studio.ai21.com',
36
40
  };
37
41
 
@@ -69,6 +69,11 @@ const Ai360: ModelProviderCard = {
69
69
  modelList: { showModelFetcher: true },
70
70
  modelsUrl: 'https://ai.360.cn/platform/docs/overview',
71
71
  name: '360 AI',
72
+ settings: {
73
+ disableBrowserRequest: true,
74
+ sdkType: 'openai',
75
+ showModelFetcher: true,
76
+ },
72
77
  url: 'https://ai.360.com',
73
78
  };
74
79
 
@@ -137,6 +137,17 @@ const Anthropic: ModelProviderCard = {
137
137
  proxyUrl: {
138
138
  placeholder: 'https://api.anthropic.com',
139
139
  },
140
+ settings: {
141
+ proxyUrl: {
142
+ placeholder: 'https://api.anthropic.com',
143
+ },
144
+ sdkType: 'anthropic',
145
+ showModelFetcher: true,
146
+ smoothing: {
147
+ speed: 5,
148
+ text: true,
149
+ },
150
+ },
140
151
  smoothing: {
141
152
  speed: 5,
142
153
  text: true,
@@ -59,6 +59,10 @@ const Azure: ModelProviderCard = {
59
59
  id: 'azure',
60
60
  modelsUrl: 'https://learn.microsoft.com/azure/ai-services/openai/concepts/models',
61
61
  name: 'Azure',
62
+ settings: {
63
+ defaultShowBrowserRequest: true,
64
+ sdkType: 'azure',
65
+ },
62
66
  url: 'https://azure.microsoft.com',
63
67
  };
64
68
 
@@ -96,6 +96,14 @@ const Baichuan: ModelProviderCard = {
96
96
  modelList: { showModelFetcher: true },
97
97
  modelsUrl: 'https://platform.baichuan-ai.com/price',
98
98
  name: 'Baichuan',
99
+ settings: {
100
+ sdkType: 'openai',
101
+ showModelFetcher: true,
102
+ smoothing: {
103
+ speed: 2,
104
+ text: true,
105
+ },
106
+ },
99
107
  smoothing: {
100
108
  speed: 2,
101
109
  text: true,
@@ -309,6 +309,7 @@ const Bedrock: ModelProviderCard = {
309
309
  id: 'bedrock',
310
310
  modelsUrl: 'https://docs.aws.amazon.com/bedrock/latest/userguide/model-ids.html',
311
311
  name: 'Bedrock',
312
+ settings: { sdkType: 'bedrock' },
312
313
  url: 'https://docs.aws.amazon.com/bedrock/latest/userguide/what-is-bedrock.html',
313
314
  };
314
315
 
@@ -84,6 +84,11 @@ const Cloudflare: ModelProviderCard = {
84
84
  showModelFetcher: true,
85
85
  },
86
86
  name: 'Cloudflare Workers AI',
87
+ settings: {
88
+ disableBrowserRequest: true,
89
+ sdkType: 'cloudflare',
90
+ showModelFetcher: true,
91
+ },
87
92
  url: 'https://developers.cloudflare.com/workers-ai/models',
88
93
  };
89
94
 
@@ -27,6 +27,10 @@ const DeepSeek: ModelProviderCard = {
27
27
  modelList: { showModelFetcher: true },
28
28
  modelsUrl: 'https://platform.deepseek.com/api-docs/zh-cn/quick_start/pricing',
29
29
  name: 'DeepSeek',
30
+ settings: {
31
+ sdkType: 'openai',
32
+ showModelFetcher: true,
33
+ },
30
34
  url: 'https://deepseek.com',
31
35
  };
32
36
 
@@ -218,6 +218,10 @@ const FireworksAI: ModelProviderCard = {
218
218
  modelList: { showModelFetcher: true },
219
219
  modelsUrl: 'https://fireworks.ai/models?show=Serverless',
220
220
  name: 'Fireworks AI',
221
+ settings: {
222
+ sdkType: 'openai',
223
+ showModelFetcher: true,
224
+ },
221
225
  url: 'https://fireworks.ai',
222
226
  };
223
227
 
@@ -118,6 +118,11 @@ const GiteeAI: ModelProviderCard = {
118
118
  modelList: { showModelFetcher: true },
119
119
  modelsUrl: 'https://ai.gitee.com/docs/openapi/v1#tag/serverless/POST/chat/completions',
120
120
  name: 'Gitee AI',
121
+ settings: {
122
+ disableBrowserRequest: true,
123
+ sdkType: 'openai',
124
+ showModelFetcher: true,
125
+ },
121
126
  url: 'https://ai.gitee.com',
122
127
  };
123
128
 
@@ -229,8 +229,13 @@ const Github: ModelProviderCard = {
229
229
  description: '通过GitHub模型,开发人员可以成为AI工程师,并使用行业领先的AI模型进行构建。',
230
230
  enabled: true,
231
231
  id: 'github',
232
- modelList: { showModelFetcher: true }, // I'm not sure if it is good to show the model fetcher, as remote list is not complete.
232
+ modelList: { showModelFetcher: true },
233
+ // I'm not sure if it is good to show the model fetcher, as remote list is not complete.
233
234
  name: 'GitHub',
235
+ settings: {
236
+ sdkType: 'azure',
237
+ showModelFetcher: true,
238
+ },
234
239
  url: 'https://github.com/marketplace/models',
235
240
  };
236
241
 
@@ -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,
@@ -152,6 +152,9 @@ const Mistral: ModelProviderCard = {
152
152
  id: 'mistral',
153
153
  modelsUrl: 'https://docs.mistral.ai/getting-started/models',
154
154
  name: 'Mistral',
155
+ settings: {
156
+ sdkType: 'openai',
157
+ },
155
158
  url: 'https://mistral.ai',
156
159
  };
157
160
 
@@ -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
  };
@@ -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
 
@@ -143,6 +143,7 @@ const ZeroOne: ModelProviderCard = {
143
143
  id: 'zeroone',
144
144
  modelsUrl: 'https://platform.lingyiwanwu.com/docs#模型与计费',
145
145
  name: '01.AI',
146
+ settings: { sdkType: 'openai' },
146
147
  url: 'https://www.lingyiwanwu.com/',
147
148
  };
148
149
 
@@ -201,6 +201,7 @@ const ZhiPu: ModelProviderCard = {
201
201
  id: 'zhipu',
202
202
  modelsUrl: 'https://open.bigmodel.cn/dev/howuse/model',
203
203
  name: 'ZhiPu',
204
+ settings: { sdkType: 'openai' },
204
205
  url: 'https://zhipuai.cn',
205
206
  };
206
207
 
@@ -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 { useUserStore } from '@/store/user';
8
- import { modelProviderSelectors } from '@/store/user/selectors';
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 = useUserStore(modelProviderSelectors.modelProviderListForModelSelect, isEqual);
30
+ const enabledList = useEnabledChatModels();
33
31
 
34
32
  const { styles } = useStyles();
35
33
 
36
34
  const options = useMemo<SelectProps['options']>(() => {
37
- const getChatModels = (provider: ModelProviderCard) =>
38
- provider.chatModels.map((model) => ({
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 { useUserStore } from '@/store/user';
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 = useUserStore(modelProviderSelectors.modelProviderListForModelSelect, isEqual);
55
+ const enabledList = useEnabledChatModels();
58
56
 
59
57
  const items = useMemo<ItemType[]>(() => {
60
- const getModelItems = (provider: ModelProviderCard) => {
61
- const items = provider.chatModels.map((model) => ({
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): ModelProviderCard[] =>
92
+ const modelProviderListForModelSelect = (s: UserStore): EnabledProviderWithModels[] =>
92
93
  modelProviderList(s)
93
94
  .filter((s) => s.enabled)
94
95
  .map((provider) => ({
95
96
  ...provider,
96
- chatModels: provider.chatModels.filter((model) => model.enabled),
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) => {
@@ -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
+ }
@@ -1,7 +1,32 @@
1
1
  import { z } from 'zod';
2
2
 
3
+ import { AiModelSourceType, AiModelType, ModelAbilities } from '@/types/aiModel';
3
4
  import { SmoothingParams } from '@/types/llm';
4
5
 
6
+ export const AiProviderSourceEnum = {
7
+ Builtin: 'builtin',
8
+ Custom: 'custom',
9
+ } as const;
10
+ export type AiProviderSourceType = (typeof AiProviderSourceEnum)[keyof typeof AiProviderSourceEnum];
11
+
12
+ /**
13
+ * only when provider use different sdk
14
+ * we will add a type
15
+ */
16
+ export const AiProviderSDKEnum = {
17
+ Anthropic: 'anthropic',
18
+ Azure: 'azure',
19
+ Bedrock: 'bedrock',
20
+ Cloudflare: 'cloudflare',
21
+ Google: 'google',
22
+ Huggingface: 'huggingface',
23
+ Ollama: 'ollama',
24
+ Openai: 'openai',
25
+ Wenxin: 'wenxin',
26
+ } as const;
27
+
28
+ export type AiProviderSDKType = (typeof AiProviderSDKEnum)[keyof typeof AiProviderSDKEnum];
29
+
5
30
  // create
6
31
  export const CreateAiProviderSchema = z.object({
7
32
  config: z.object({}).passthrough().optional(),
@@ -11,6 +36,7 @@ export const CreateAiProviderSchema = z.object({
11
36
  logo: z.string().optional(),
12
37
  name: z.string(),
13
38
  sdkType: z.enum(['openai', 'anthropic']).optional(),
39
+ source: z.enum(['builtin', 'custom']),
14
40
  // checkModel: z.string().optional(),
15
41
  // homeUrl: z.string().optional(),
16
42
  // modelsUrl: z.string().optional(),
@@ -27,12 +53,12 @@ export interface AiProviderListItem {
27
53
  logo?: string;
28
54
  name?: string;
29
55
  sort?: number;
30
- source: 'builtin' | 'custom';
56
+ source: AiProviderSourceType;
31
57
  }
32
58
 
33
59
  // Detail Query
34
60
 
35
- interface AiProviderConfig {
61
+ export interface AiProviderSettings {
36
62
  /**
37
63
  * whether provider show browser request option by default
38
64
  *
@@ -54,12 +80,16 @@ interface AiProviderConfig {
54
80
  }
55
81
  | false;
56
82
 
83
+ /**
84
+ * default openai
85
+ */
86
+ sdkType?: AiProviderSDKType;
87
+
57
88
  /**
58
89
  * whether show api key in the provider config
59
90
  * so provider like ollama don't need api key field
60
91
  */
61
92
  showApiKey?: boolean;
62
-
63
93
  /**
64
94
  * whether show checker in the provider config
65
95
  */
@@ -72,12 +102,12 @@ interface AiProviderConfig {
72
102
  smoothing?: SmoothingParams;
73
103
  }
74
104
 
75
- export interface AiProviderItem {
105
+ export interface AiProviderCard {
76
106
  /**
77
107
  * the default model that used for connection check
78
108
  */
79
109
  checkModel?: string;
80
- config: AiProviderConfig;
110
+ config: AiProviderSettings;
81
111
  description?: string;
82
112
  enabled: boolean;
83
113
  enabledChatModels: string[];
@@ -95,11 +125,6 @@ export interface AiProviderItem {
95
125
  * the name show for end user
96
126
  */
97
127
  name: string;
98
- /**
99
- * default openai
100
- */
101
- sdkType?: 'openai' | 'anthropic';
102
- source: 'builtin' | 'custom';
103
128
  }
104
129
 
105
130
  export interface AiProviderDetailItem {
@@ -107,7 +132,6 @@ export interface AiProviderDetailItem {
107
132
  * the default model that used for connection check
108
133
  */
109
134
  checkModel?: string;
110
- config: AiProviderConfig;
111
135
  description?: string;
112
136
  enabled: boolean;
113
137
  fetchOnClient?: boolean;
@@ -126,14 +150,21 @@ export interface AiProviderDetailItem {
126
150
  * the name show for end user
127
151
  */
128
152
  name: string;
129
- /**
130
- * default openai
131
- */
132
- sdkType?: 'openai' | 'anthropic';
133
- source: 'builtin' | 'custom';
153
+ settings: AiProviderSettings;
154
+ source: AiProviderSourceType;
134
155
  }
135
156
 
136
157
  // Update
158
+ export const UpdateAiProviderSchema = z.object({
159
+ config: z.object({}).passthrough().optional(),
160
+ description: z.string().optional(),
161
+ logo: z.string().optional(),
162
+ name: z.string(),
163
+ sdkType: z.enum(['openai', 'anthropic']).optional(),
164
+ });
165
+
166
+ export type UpdateAiProviderParams = z.infer<typeof UpdateAiProviderSchema>;
167
+
137
168
  export const UpdateAiProviderConfigSchema = z.object({
138
169
  checkModel: z.string().optional(),
139
170
  fetchOnClient: z.boolean().optional(),
@@ -146,3 +177,26 @@ export interface AiProviderSortMap {
146
177
  id: string;
147
178
  sort: number;
148
179
  }
180
+
181
+ // --------
182
+
183
+ export interface EnabledProvider {
184
+ id: string;
185
+ name?: string;
186
+ source: AiModelSourceType;
187
+ }
188
+
189
+ export interface EnabledAiModel {
190
+ abilities: ModelAbilities;
191
+ contextWindowTokens?: number;
192
+ displayName?: string;
193
+ id: string;
194
+ providerId: string;
195
+ type: AiModelType;
196
+ }
197
+
198
+ export interface AiProviderInitState {
199
+ enabledAiModels: EnabledAiModel[];
200
+ enabledAiProviders: EnabledProvider[];
201
+ keyVaults: Record<string, object>;
202
+ }
package/src/types/llm.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  import { ReactNode } from 'react';
2
2
 
3
3
  import { ChatModelPricing } from '@/types/aiModel';
4
+ import { AiProviderSettings } from '@/types/aiProvider';
4
5
 
5
6
  export type ModelPriceCurrency = 'CNY' | 'USD';
6
7
 
@@ -56,6 +57,9 @@ export interface SmoothingParams {
56
57
  }
57
58
 
58
59
  export interface ModelProviderCard {
60
+ /**
61
+ * @deprecated
62
+ */
59
63
  chatModels: ChatModelCard[];
60
64
  /**
61
65
  * the default model that used for connection check
@@ -63,7 +67,7 @@ export interface ModelProviderCard {
63
67
  checkModel?: string;
64
68
  /**
65
69
  * whether provider show browser request option by default
66
- *
70
+ * @deprecated
67
71
  * @default false
68
72
  */
69
73
  defaultShowBrowserRequest?: boolean;
@@ -71,7 +75,7 @@ export interface ModelProviderCard {
71
75
  /**
72
76
  * some provider server like stepfun and aliyun don't support browser request,
73
77
  * So we should disable it
74
- *
78
+ * @deprecated
75
79
  * @default false
76
80
  */
77
81
  disableBrowserRequest?: boolean;
@@ -80,6 +84,9 @@ export interface ModelProviderCard {
80
84
  */
81
85
  enabled?: boolean;
82
86
  id: string;
87
+ /**
88
+ * @deprecated
89
+ */
83
90
  modelList?: {
84
91
  azureDeployName?: boolean;
85
92
  notFoundContent?: ReactNode;
@@ -94,6 +101,9 @@ export interface ModelProviderCard {
94
101
  * the name show for end user
95
102
  */
96
103
  name: string;
104
+ /**
105
+ * @deprecated
106
+ */
97
107
  proxyUrl?:
98
108
  | {
99
109
  desc?: string;
@@ -102,20 +112,25 @@ export interface ModelProviderCard {
102
112
  }
103
113
  | false;
104
114
 
115
+ settings: AiProviderSettings;
105
116
  /**
106
117
  * whether show api key in the provider config
107
118
  * so provider like ollama don't need api key field
119
+ * @deprecated
108
120
  */
109
121
  showApiKey?: boolean;
122
+
110
123
  /**
111
124
  * whether show checker in the provider config
125
+ * @deprecated
112
126
  */
113
127
  showChecker?: boolean;
128
+
114
129
  /**
115
130
  * whether to smoothing the output
131
+ * @deprecated
116
132
  */
117
133
  smoothing?: SmoothingParams;
118
-
119
134
  /**
120
135
  * provider's website url
121
136
  */