@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.
Files changed (125) hide show
  1. package/CHANGELOG.md +42 -0
  2. package/README.ja-JP.md +6 -6
  3. package/README.md +6 -6
  4. package/README.zh-CN.md +7 -7
  5. package/changelog/v1.json +14 -0
  6. package/locales/ar/components.json +3 -0
  7. package/locales/ar/modelProvider.json +0 -16
  8. package/locales/ar/models.json +12 -0
  9. package/locales/ar/setting.json +1 -2
  10. package/locales/bg-BG/components.json +3 -0
  11. package/locales/bg-BG/modelProvider.json +0 -16
  12. package/locales/bg-BG/models.json +12 -0
  13. package/locales/bg-BG/setting.json +1 -2
  14. package/locales/de-DE/components.json +3 -0
  15. package/locales/de-DE/modelProvider.json +0 -16
  16. package/locales/de-DE/models.json +12 -0
  17. package/locales/de-DE/setting.json +1 -2
  18. package/locales/en-US/components.json +3 -0
  19. package/locales/en-US/modelProvider.json +0 -16
  20. package/locales/en-US/models.json +12 -0
  21. package/locales/en-US/setting.json +1 -2
  22. package/locales/es-ES/components.json +3 -0
  23. package/locales/es-ES/modelProvider.json +0 -16
  24. package/locales/es-ES/models.json +12 -0
  25. package/locales/es-ES/setting.json +1 -2
  26. package/locales/fa-IR/components.json +3 -0
  27. package/locales/fa-IR/modelProvider.json +0 -16
  28. package/locales/fa-IR/models.json +12 -0
  29. package/locales/fa-IR/setting.json +1 -2
  30. package/locales/fr-FR/components.json +3 -0
  31. package/locales/fr-FR/modelProvider.json +0 -16
  32. package/locales/fr-FR/models.json +12 -0
  33. package/locales/fr-FR/setting.json +1 -2
  34. package/locales/it-IT/components.json +3 -0
  35. package/locales/it-IT/modelProvider.json +0 -16
  36. package/locales/it-IT/models.json +12 -0
  37. package/locales/it-IT/setting.json +1 -2
  38. package/locales/ja-JP/components.json +3 -0
  39. package/locales/ja-JP/modelProvider.json +0 -16
  40. package/locales/ja-JP/models.json +12 -0
  41. package/locales/ja-JP/setting.json +1 -2
  42. package/locales/ko-KR/components.json +3 -0
  43. package/locales/ko-KR/modelProvider.json +0 -16
  44. package/locales/ko-KR/models.json +12 -0
  45. package/locales/ko-KR/setting.json +1 -2
  46. package/locales/nl-NL/components.json +3 -0
  47. package/locales/nl-NL/modelProvider.json +0 -16
  48. package/locales/nl-NL/models.json +12 -0
  49. package/locales/nl-NL/setting.json +1 -2
  50. package/locales/pl-PL/components.json +3 -0
  51. package/locales/pl-PL/modelProvider.json +0 -16
  52. package/locales/pl-PL/models.json +12 -0
  53. package/locales/pl-PL/setting.json +1 -2
  54. package/locales/pt-BR/components.json +3 -0
  55. package/locales/pt-BR/modelProvider.json +0 -16
  56. package/locales/pt-BR/models.json +12 -0
  57. package/locales/pt-BR/setting.json +1 -2
  58. package/locales/ru-RU/components.json +3 -0
  59. package/locales/ru-RU/modelProvider.json +0 -16
  60. package/locales/ru-RU/models.json +12 -0
  61. package/locales/ru-RU/setting.json +1 -2
  62. package/locales/tr-TR/components.json +3 -0
  63. package/locales/tr-TR/modelProvider.json +0 -16
  64. package/locales/tr-TR/models.json +12 -0
  65. package/locales/tr-TR/setting.json +1 -2
  66. package/locales/vi-VN/components.json +3 -0
  67. package/locales/vi-VN/modelProvider.json +0 -16
  68. package/locales/vi-VN/models.json +12 -0
  69. package/locales/vi-VN/setting.json +1 -2
  70. package/locales/zh-CN/common.json +1 -1
  71. package/locales/zh-CN/components.json +3 -0
  72. package/locales/zh-CN/modelProvider.json +0 -16
  73. package/locales/zh-CN/models.json +12 -0
  74. package/locales/zh-CN/providers.json +1 -1
  75. package/locales/zh-CN/setting.json +1 -2
  76. package/locales/zh-TW/components.json +3 -0
  77. package/locales/zh-TW/modelProvider.json +0 -16
  78. package/locales/zh-TW/models.json +12 -0
  79. package/locales/zh-TW/setting.json +1 -2
  80. package/package.json +3 -3
  81. package/src/app/(main)/settings/_layout/Desktop/SideBar.tsx +5 -1
  82. package/src/config/modelProviders/ai21.ts +4 -0
  83. package/src/config/modelProviders/ai360.ts +5 -0
  84. package/src/config/modelProviders/anthropic.ts +11 -0
  85. package/src/config/modelProviders/azure.ts +4 -0
  86. package/src/config/modelProviders/baichuan.ts +8 -0
  87. package/src/config/modelProviders/bedrock.ts +1 -0
  88. package/src/config/modelProviders/cloudflare.ts +5 -0
  89. package/src/config/modelProviders/deepseek.ts +4 -0
  90. package/src/config/modelProviders/fireworksai.ts +4 -0
  91. package/src/config/modelProviders/giteeai.ts +5 -0
  92. package/src/config/modelProviders/github.ts +6 -1
  93. package/src/config/modelProviders/google.ts +10 -0
  94. package/src/config/modelProviders/groq.ts +7 -0
  95. package/src/config/modelProviders/higress.ts +9 -0
  96. package/src/config/modelProviders/huggingface.ts +5 -0
  97. package/src/config/modelProviders/hunyuan.ts +5 -0
  98. package/src/config/modelProviders/internlm.ts +5 -0
  99. package/src/config/modelProviders/minimax.ts +7 -0
  100. package/src/config/modelProviders/mistral.ts +3 -0
  101. package/src/config/modelProviders/moonshot.ts +10 -0
  102. package/src/config/modelProviders/novita.ts +5 -0
  103. package/src/config/modelProviders/ollama.ts +6 -8
  104. package/src/config/modelProviders/openai.ts +5 -2
  105. package/src/config/modelProviders/openrouter.ts +5 -1
  106. package/src/config/modelProviders/perplexity.ts +6 -0
  107. package/src/config/modelProviders/qwen.ts +12 -0
  108. package/src/config/modelProviders/sensenova.ts +5 -0
  109. package/src/config/modelProviders/siliconcloud.ts +7 -0
  110. package/src/config/modelProviders/spark.ts +8 -0
  111. package/src/config/modelProviders/stepfun.ts +9 -0
  112. package/src/config/modelProviders/taichu.ts +4 -0
  113. package/src/config/modelProviders/togetherai.ts +4 -0
  114. package/src/config/modelProviders/upstage.ts +4 -0
  115. package/src/config/modelProviders/wenxin.ts +8 -0
  116. package/src/config/modelProviders/xai.ts +7 -0
  117. package/src/config/modelProviders/zeroone.ts +1 -0
  118. package/src/config/modelProviders/zhipu.ts +1 -0
  119. package/src/features/ModelSelect/index.tsx +6 -8
  120. package/src/features/ModelSwitchPanel/index.tsx +6 -8
  121. package/src/hooks/useEnabledChatModels.ts +9 -0
  122. package/src/store/user/slices/modelList/selectors/modelProvider.ts +13 -2
  123. package/src/types/aiModel.ts +15 -0
  124. package/src/types/aiProvider.ts +70 -16
  125. 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,
@@ -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
  };
@@ -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
 
@@ -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
+ }