Skip to content

Commit d771bc6

Browse files
committed
perf: model provider
1 parent cbba9e1 commit d771bc6

File tree

37 files changed

+312
-325
lines changed

37 files changed

+312
-325
lines changed

document/content/docs/upgrading/4-12/4123.mdx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ description: 'FastGPT V4.12.3 更新说明'
1010
## ⚙️ 优化
1111

1212
1. 纠正 RRF 权重合并算法,使用标准 RRF 权重公式。
13+
2. 将模型提供商配置移动到 plugin,实现热更新。
1314

1415
## 🐛 修复
1516

document/data/doc-last-modified.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@
105105
"document/content/docs/upgrading/4-12/4120.mdx": "2025-08-12T22:45:19+08:00",
106106
"document/content/docs/upgrading/4-12/4121.mdx": "2025-08-15T22:53:06+08:00",
107107
"document/content/docs/upgrading/4-12/4122.mdx": "2025-08-27T00:31:33+08:00",
108-
"document/content/docs/upgrading/4-12/4123.mdx": "2025-08-29T01:24:19+08:00",
108+
"document/content/docs/upgrading/4-12/4123.mdx": "2025-09-01T21:03:58+08:00",
109109
"document/content/docs/upgrading/4-8/40.mdx": "2025-08-02T19:38:37+08:00",
110110
"document/content/docs/upgrading/4-8/41.mdx": "2025-08-02T19:38:37+08:00",
111111
"document/content/docs/upgrading/4-8/42.mdx": "2025-08-02T19:38:37+08:00",

packages/global/common/i18n/utils.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import type { I18nStringType, localeType } from './type';
22

3-
export const parseI18nString = (str: I18nStringType | string = '', lang: localeType = 'en') => {
3+
export const parseI18nString = (str: I18nStringType | string = '', lang = 'en') => {
44
if (!str || typeof str === 'string') return str;
5-
return str[lang] ?? str['en'];
5+
return str[lang as localeType] ?? str['en'];
66
};

packages/global/core/ai/provider.ts

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
import type { I18nStringStrictType } from '@fastgpt-sdk/plugin';
2+
3+
export type ModelProviderItemType = {
4+
id: string;
5+
name: string;
6+
avatar: string;
7+
order: number;
8+
};
9+
10+
export type ModelProviderListType = {
11+
id: string;
12+
name: I18nStringStrictType | string;
13+
avatar: string;
14+
provider: string;
15+
};
16+
17+
export type langType = keyof I18nStringStrictType;
18+
19+
export const defaultProvider: ModelProviderItemType = {
20+
id: 'Other',
21+
name: 'Other',
22+
avatar: 'model/huggingface',
23+
order: 999
24+
};
25+
26+
export const formatModelProviders = (data: { provider: string; value: I18nStringStrictType }[]) => {
27+
const getLocalizedName = (translations: I18nStringStrictType, language = 'en'): string => {
28+
return translations[language as langType] || translations.en;
29+
};
30+
31+
const formatModelProviderList = (language?: string): ModelProviderItemType[] => {
32+
return data.map(({ provider, value }, index) => ({
33+
id: provider,
34+
name: getLocalizedName(value, language),
35+
avatar: `/api/system/plugin/models/${provider}.svg`,
36+
order: index
37+
}));
38+
};
39+
40+
const formatModelProviderMap = (language?: string) => {
41+
const provider = {} as Record<string, ModelProviderItemType>;
42+
43+
data.forEach(({ provider: id, value }, index) => {
44+
provider[id] = {
45+
id,
46+
name: getLocalizedName(value, language),
47+
avatar: `/api/system/plugin/models/${id}.svg`,
48+
order: index
49+
};
50+
});
51+
52+
return provider;
53+
};
54+
55+
const ModelProviderListCache = {
56+
en: formatModelProviderList('en'),
57+
'zh-CN': formatModelProviderList('zh-CN'),
58+
'zh-Hant': formatModelProviderList('zh-Hant')
59+
};
60+
const ModelProviderMapCache = {
61+
en: formatModelProviderMap('en'),
62+
'zh-CN': formatModelProviderMap('zh-CN'),
63+
'zh-Hant': formatModelProviderMap('zh-Hant')
64+
};
65+
66+
return {
67+
ModelProviderListCache,
68+
ModelProviderMapCache
69+
};
70+
};

packages/global/core/app/model/type.ts

Lines changed: 0 additions & 31 deletions
This file was deleted.

packages/global/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"name": "@fastgpt/global",
33
"version": "1.0.0",
44
"dependencies": {
5-
"@fastgpt-sdk/plugin": "^0.1.12",
5+
"@fastgpt-sdk/plugin": "^0.1.14",
66
"@apidevtools/swagger-parser": "^10.1.0",
77
"@bany/curl-to-json": "^1.2.8",
88
"axios": "^1.8.2",

packages/global/sdk/fastgpt-plugin.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1 @@
11
export * from '@fastgpt-sdk/plugin';
2-
3-
export { default } from '@fastgpt-sdk/plugin';

packages/service/core/ai/config/utils.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,8 @@ export const loadSystemModels = async (init = false, language = 'en') => {
7878

7979
if (!init && global.systemModelList) return;
8080

81+
await preloadModelProviders();
82+
8183
global.systemModelList = [];
8284
global.systemActiveModelList = [];
8385
global.llmModelMap = new Map<string, LLMModelItemType>();
@@ -110,14 +112,13 @@ export const loadSystemModels = async (init = false, language = 'en') => {
110112
};
111113

112114
const dbModel = dbModels.find((item) => item.model === model.model);
115+
const provider = getModelProvider(dbModel?.metadata?.provider || model.provider, language);
113116

114117
const modelData: any = {
115118
...model,
116119
...dbModel?.metadata,
117-
provider: getModelProvider(
118-
dbModel?.metadata?.provider || (model.provider as any),
119-
language
120-
).id,
120+
provider: provider.id,
121+
avatar: provider.avatar,
121122
type: dbModel?.metadata?.type || model.type,
122123
isCustom: false,
123124

@@ -259,7 +260,6 @@ export const cronRefreshModels = async () => {
259260
setCron('*/5 * * * *', async () => {
260261
// 1. 更新模型(所有节点都会触发)
261262
await loadSystemModels(true);
262-
await preloadModelProviders();
263263
// 2. 更新缓存(仅主节点触发)
264264
await updateFastGPTConfigBuffer();
265265
});

packages/service/core/ai/type.d.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,12 @@ import type {
66
EmbeddingModelItemType,
77
LLMModelItemType
88
} from '@fastgpt/global/core/ai/model.d';
9+
import type { ModelProviderListType } from '@fastgpt/global/core/app/model/type';
10+
import type {
11+
AiproxyMapProviderType,
12+
I18nStringStrictType
13+
} from '@fastgpt/global/sdk/fastgpt-plugin';
14+
import type { langType, ModelProviderItemType } from '@fastgpt/global/core/ai/provider';
915

1016
export type SystemModelSchemaType = {
1117
_id: string;
@@ -32,6 +38,11 @@ export type SystemDefaultModelType = {
3238
};
3339

3440
declare global {
41+
var ModelProviderRawCache: { provider: string; value: I18nStringStrictType }[];
42+
var ModelProviderListCache: Record<langType, ModelProviderItemType[]>;
43+
var ModelProviderMapCache: Record<langType, Record<string, ModelProviderItemType>>;
44+
var aiproxyIdMapCache: AiproxyMapProviderType;
45+
3546
var systemModelList: SystemModelItemType[];
3647
// var systemModelMap: Map<string, SystemModelItemType>;
3748
var llmModelMap: Map<string, LLMModelItemType>;
Lines changed: 16 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -1,69 +1,29 @@
1-
import type { I18nStringType } from '@fastgpt/global/common/i18n/type';
2-
import { getProviderList } from '../../app/tool/api';
3-
import type { ModelProviderType } from '@fastgpt/global/core/app/model/type';
4-
5-
export const defaultProvider: ModelProviderType = {
6-
id: 'Other',
7-
name: { en: 'Other' } as I18nStringType,
8-
avatar: 'model/other',
9-
order: 0
10-
};
11-
12-
export const defaultMapData = [
13-
{
14-
id: 'Other',
15-
name: 'Other',
16-
avatar: 'model/other',
17-
provider: 'Other'
18-
}
19-
];
1+
import { loadModelProviders } from '../../../thirdProvider/fastgptPlugin/model';
2+
import {
3+
type langType,
4+
defaultProvider,
5+
formatModelProviders
6+
} from '@fastgpt/global/core/ai/provider';
207

218
// Preload model providers
229
export async function preloadModelProviders(): Promise<void> {
23-
const res = await getProviderList();
10+
const { modelProviders, aiproxyIdMap } = await loadModelProviders();
2411

25-
const ModelProviders = Object.entries(res.ModelProviders).map(
26-
([id, info]: [string, I18nStringType], index: number) => ({
27-
id: id,
28-
name: info,
29-
avatar: `/api/system/plugin/models/${id}.svg`,
30-
order: index
31-
})
32-
);
12+
const { ModelProviderListCache, ModelProviderMapCache } = formatModelProviders(modelProviders);
13+
global.ModelProviderRawCache = modelProviders;
14+
global.ModelProviderListCache = ModelProviderListCache;
15+
global.ModelProviderMapCache = ModelProviderMapCache;
3316

34-
const aiproxyIdMap = Object.entries(res.aiproxyIdMap).map(
35-
([id, info]: [
36-
string,
37-
{ name: I18nStringType | string; provider: string; avatar?: string }
38-
]) => ({
39-
id,
40-
name: info.name,
41-
avatar: info.avatar || defaultProvider.avatar,
42-
provider: info.provider
43-
})
44-
);
45-
global.ModelProviders_cache = {
46-
listData: ModelProviders,
47-
mapData: new Map(ModelProviders.map((item) => [item.id, item]))
48-
};
49-
global.aiproxyIdMap_cache = {
50-
listData: aiproxyIdMap,
51-
mapData: new Map(aiproxyIdMap.map((item) => [item.id, item]))
52-
};
17+
global.aiproxyIdMapCache = aiproxyIdMap;
5318
}
5419

20+
export const getModelProviders = (language = 'en') => {
21+
return global.ModelProviderListCache[language as langType] || [];
22+
};
5523
export const getModelProvider = (provider?: string, language = 'en') => {
5624
if (!provider) {
5725
return defaultProvider;
5826
}
5927

60-
const providerData = global.ModelProviders_cache?.mapData.get(provider);
61-
if (!providerData) {
62-
return defaultProvider;
63-
}
64-
65-
return {
66-
...providerData,
67-
name: (providerData.name as I18nStringType)[language as keyof I18nStringType]
68-
};
28+
return ModelProviderMapCache[language as langType][provider] ?? defaultProvider;
6929
};

0 commit comments

Comments
 (0)