@lobehub/chat 1.44.0 → 1.44.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,31 @@
2
2
 
3
3
  # Changelog
4
4
 
5
+ ### [Version 1.44.1](https://github.com/lobehub/lobe-chat/compare/v1.44.0...v1.44.1)
6
+
7
+ <sup>Released on **2025-01-08**</sup>
8
+
9
+ #### 🐛 Bug Fixes
10
+
11
+ - **misc**: Fix model select not auto update and sort issue.
12
+
13
+ <br/>
14
+
15
+ <details>
16
+ <summary><kbd>Improvements and Fixes</kbd></summary>
17
+
18
+ #### What's fixed
19
+
20
+ - **misc**: Fix model select not auto update and sort issue, closes [#5330](https://github.com/lobehub/lobe-chat/issues/5330) ([dc76d6f](https://github.com/lobehub/lobe-chat/commit/dc76d6f))
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.44.0](https://github.com/lobehub/lobe-chat/compare/v1.43.6...v1.44.0)
6
31
 
7
32
  <sup>Released on **2025-01-07**</sup>
package/changelog/v1.json CHANGED
@@ -1,4 +1,13 @@
1
1
  [
2
+ {
3
+ "children": {
4
+ "fixes": [
5
+ "Fix model select not auto update and sort issue."
6
+ ]
7
+ },
8
+ "date": "2025-01-08",
9
+ "version": "1.44.1"
10
+ },
2
11
  {
3
12
  "children": {
4
13
  "features": [
package/next.config.ts CHANGED
@@ -164,7 +164,7 @@ const nextConfig: NextConfig = {
164
164
  source: '/welcome',
165
165
  },
166
166
  ],
167
- serverExternalPackages: ['@electric-sql/pglite', 'shiki/wasm', 'sharp'],
167
+ serverExternalPackages: ['@electric-sql/pglite', 'sharp'],
168
168
 
169
169
  transpilePackages: ['pdfjs-dist', 'mermaid'],
170
170
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lobehub/chat",
3
- "version": "1.44.0",
3
+ "version": "1.44.1",
4
4
  "description": "Lobe Chat - an open-source, high-performance chatbot framework that supports speech synthesis, multimodal, and extensible Function Call plugin system. Supports one-click free deployment of your private ChatGPT/LLM web application.",
5
5
  "keywords": [
6
6
  "framework",
@@ -1,5 +1,5 @@
1
1
  import { IconAvatarProps, ModelIcon, ProviderIcon } from '@lobehub/icons';
2
- import { Icon, Tooltip } from '@lobehub/ui';
2
+ import { Avatar, Icon, Tooltip } from '@lobehub/ui';
3
3
  import { Typography } from 'antd';
4
4
  import { createStyles } from 'antd-style';
5
5
  import { Infinity, LucideEye, LucidePaperclip, ToyBrick } from 'lucide-react';
@@ -10,6 +10,7 @@ import { useTranslation } from 'react-i18next';
10
10
  import { Center, Flexbox } from 'react-layout-kit';
11
11
 
12
12
  import { ModelAbilities } from '@/types/aiModel';
13
+ import { AiProviderSourceType } from '@/types/aiProvider';
13
14
  import { ChatModelCard } from '@/types/llm';
14
15
  import { formatTokenNumber } from '@/utils/format';
15
16
 
@@ -153,16 +154,26 @@ export const ModelItemRender = memo<ModelItemRenderProps>(({ showInfoTag = true,
153
154
  });
154
155
 
155
156
  interface ProviderItemRenderProps {
157
+ logo?: string;
156
158
  name: string;
157
159
  provider: string;
160
+ source?: AiProviderSourceType;
158
161
  }
159
162
 
160
- export const ProviderItemRender = memo<ProviderItemRenderProps>(({ provider, name }) => (
161
- <Flexbox align={'center'} gap={4} horizontal>
162
- <ProviderIcon provider={provider} size={20} type={'mono'} />
163
- {name}
164
- </Flexbox>
165
- ));
163
+ export const ProviderItemRender = memo<ProviderItemRenderProps>(
164
+ ({ provider, name, source, logo }) => {
165
+ return (
166
+ <Flexbox align={'center'} gap={4} horizontal>
167
+ {source === 'custom' && !!logo ? (
168
+ <Avatar avatar={logo} size={20} style={{ filter: 'grayscale(1)' }} title={name} />
169
+ ) : (
170
+ <ProviderIcon provider={provider} size={20} type={'mono'} />
171
+ )}
172
+ {name}
173
+ </Flexbox>
174
+ );
175
+ },
176
+ );
166
177
 
167
178
  interface LabelRendererProps {
168
179
  Icon: FC<IconAvatarProps>;
@@ -62,7 +62,7 @@ export class AiInfraRepos {
62
62
  return list
63
63
  .filter((item) => item.enabled)
64
64
  .sort((a, b) => a.sort! - b.sort!)
65
- .map((item) => ({ id: item.id, name: item.name, source: item.source }));
65
+ .map((item) => ({ id: item.id, logo: item.logo, name: item.name, source: item.source }));
66
66
  };
67
67
 
68
68
  getEnabledModels = async () => {
@@ -86,7 +86,9 @@ export class AiInfraRepos {
86
86
  { concurrency: 10 },
87
87
  );
88
88
 
89
- return [...modelList.flat(), ...userEnabledModels] as EnabledAiModel[];
89
+ return [...modelList.flat(), ...userEnabledModels].sort(
90
+ (a, b) => (a?.sort || -1) - (b?.sort || -1),
91
+ ) as EnabledAiModel[];
90
92
  };
91
93
 
92
94
  getAiProviderModelList = async (providerId: string) => {
@@ -93,6 +93,7 @@ export class AiModelModel {
93
93
  enabled: aiModels.enabled,
94
94
  id: aiModels.id,
95
95
  providerId: aiModels.providerId,
96
+ sort: aiModels.sort,
96
97
  source: aiModels.source,
97
98
  type: aiModels.type,
98
99
  })
@@ -46,7 +46,14 @@ const ModelSelect = memo<ModelSelectProps>(({ value, onChange, showAbility = tru
46
46
  }
47
47
 
48
48
  return enabledList.map((provider) => ({
49
- label: <ProviderItemRender name={provider.name} provider={provider.id} />,
49
+ label: (
50
+ <ProviderItemRender
51
+ logo={provider.logo}
52
+ name={provider.name}
53
+ provider={provider.id}
54
+ source={provider.source}
55
+ />
56
+ ),
50
57
  options: getChatModels(provider),
51
58
  }));
52
59
  }, [enabledList]);
@@ -88,7 +88,14 @@ const ModelSwitchPanel = memo<PropsWithChildren>(({ children }) => {
88
88
  return enabledList.map((provider) => ({
89
89
  children: getModelItems(provider),
90
90
  key: provider.id,
91
- label: <ProviderItemRender name={provider.name} provider={provider.id} />,
91
+ label: (
92
+ <ProviderItemRender
93
+ logo={provider.logo}
94
+ name={provider.name}
95
+ provider={provider.id}
96
+ source={provider.source}
97
+ />
98
+ ),
92
99
  type: 'group',
93
100
  }));
94
101
  }, [enabledList]);
@@ -84,7 +84,7 @@ export const createAiProviderSlice: StateCreator<
84
84
  await get().refreshAiProviderRuntimeState();
85
85
  },
86
86
  refreshAiProviderRuntimeState: async () => {
87
- await mutate(AiProviderSwrKey.fetchAiProviderRuntimeState);
87
+ await mutate([AiProviderSwrKey.fetchAiProviderRuntimeState, true]);
88
88
  },
89
89
  removeAiProvider: async (id) => {
90
90
  await aiProviderService.deleteAiProvider(id);
@@ -187,8 +187,8 @@ export const createAiProviderSlice: StateCreator<
187
187
 
188
188
  // 3. 组装最终数据结构
189
189
  const enabledChatModelList = data.enabledAiProviders.map((provider) => ({
190
+ ...provider,
190
191
  children: getModelListByType(provider.id, 'chat'),
191
- id: provider.id,
192
192
  name: provider.name || provider.id,
193
193
  }));
194
194
 
@@ -105,6 +105,7 @@ const modelProviderListForModelSelect = (s: UserStore): EnabledProviderWithModel
105
105
  displayName: m.displayName,
106
106
  id: m.id,
107
107
  })),
108
+ source: 'builtin',
108
109
  }));
109
110
 
110
111
  const getModelCardById = (id: string) => (s: UserStore) => {
@@ -1,5 +1,7 @@
1
1
  import { z } from 'zod';
2
2
 
3
+ import { AiProviderSourceType } from '@/types/aiProvider';
4
+
3
5
  export type ModelPriceCurrency = 'CNY' | 'USD';
4
6
 
5
7
  export const AiModelSourceEnum = {
@@ -312,5 +314,7 @@ interface AiModelForSelect {
312
314
  export interface EnabledProviderWithModels {
313
315
  children: AiModelForSelect[];
314
316
  id: string;
317
+ logo?: string;
315
318
  name: string;
319
+ source: AiProviderSourceType;
316
320
  }
@@ -1,6 +1,6 @@
1
1
  import { z } from 'zod';
2
2
 
3
- import { AiModelConfig, AiModelSourceType, AiModelType, ModelAbilities } from '@/types/aiModel';
3
+ import { AiModelConfig, AiModelType, ModelAbilities } from '@/types/aiModel';
4
4
  import { SmoothingParams } from '@/types/llm';
5
5
 
6
6
  export const AiProviderSourceEnum = {
@@ -182,8 +182,9 @@ export interface AiProviderSortMap {
182
182
 
183
183
  export interface EnabledProvider {
184
184
  id: string;
185
+ logo?: string;
185
186
  name?: string;
186
- source: AiModelSourceType;
187
+ source: AiProviderSourceType;
187
188
  }
188
189
 
189
190
  export interface EnabledAiModel {
@@ -193,6 +194,7 @@ export interface EnabledAiModel {
193
194
  displayName?: string;
194
195
  id: string;
195
196
  providerId: string;
197
+ sort?: number;
196
198
  type: AiModelType;
197
199
  }
198
200