diff --git a/docSite/content/zh-cn/docs/development/configuration.md b/docSite/content/zh-cn/docs/development/configuration.md
index eb5b6b653818..57a7fa1262fe 100644
--- a/docSite/content/zh-cn/docs/development/configuration.md
+++ b/docSite/content/zh-cn/docs/development/configuration.md
@@ -21,16 +21,16 @@ weight: 708
"lafEnv": "https://laf.dev" // laf环境。 https://laf.run (杭州阿里云) ,或者私有化的laf环境。如果使用 Laf openapi 功能,需要最新版的 laf 。
},
"systemEnv": {
- "vectorMaxProcess": 15,
- "qaMaxProcess": 15,
+ "vectorMaxProcess": 15, // 向量处理线程数量
+ "qaMaxProcess": 15, // 问答拆分线程数量
"tokenWorkers": 50, // Token 计算线程保持数,会持续占用内存,不能设置太大。
"pgHNSWEfSearch": 100 // 向量搜索参数。越大,搜索越精确,但是速度越慢。设置为100,有99%+精度。
},
"llmModels": [
{
+ "provider": "OpenAI", // 模型提供商,主要用于分类展示,目前已经内置提供商包括:https://github.com/labring/FastGPT/blob/main/packages/global/core/ai/provider.ts, 可 pr 提供新的提供商,或直接填写 Other
"model": "gpt-4o-mini", // 模型名(对应OneAPI中渠道的模型名)
"name": "gpt-4o-mini", // 模型别名
- "avatar": "/imgs/model/openai.svg", // 模型的logo
"maxContext": 125000, // 最大上下文
"maxResponse": 16000, // 最大回复
"quoteMaxToken": 120000, // 最大引用内容
@@ -38,7 +38,7 @@ weight: 708
"charsPointsPrice": 0, // n积分/1k token(商业版)
"censor": false, // 是否开启敏感校验(商业版)
"vision": true, // 是否支持图片输入
- "datasetProcess": true, // 是否设置为知识库处理模型(QA),务必保证至少有一个为true,否则知识库会报错
+ "datasetProcess": true, // 是否设置为文本理解模型(QA),务必保证至少有一个为true,否则知识库会报错
"usedInClassify": true, // 是否用于问题分类(务必保证至少有一个为true)
"usedInExtractFields": true, // 是否用于内容提取(务必保证至少有一个为true)
"usedInToolCall": true, // 是否用于工具调用(务必保证至少有一个为true)
@@ -48,12 +48,13 @@ weight: 708
"customCQPrompt": "", // 自定义文本分类提示词(不支持工具和函数调用的模型
"customExtractPrompt": "", // 自定义内容提取提示词
"defaultSystemChatPrompt": "", // 对话默认携带的系统提示词
- "defaultConfig": {} // 请求API时,挟带一些默认配置(比如 GLM4 的 top_p)
+ "defaultConfig": {}, // 请求API时,挟带一些默认配置(比如 GLM4 的 top_p)
+ "fieldMap": {} // 字段映射(o1 模型需要把 max_tokens 映射为 max_completion_tokens)
},
{
+ "provider": "OpenAI",
"model": "gpt-4o",
"name": "gpt-4o",
- "avatar": "/imgs/model/openai.svg",
"maxContext": 125000,
"maxResponse": 4000,
"quoteMaxToken": 120000,
@@ -71,14 +72,15 @@ weight: 708
"customCQPrompt": "",
"customExtractPrompt": "",
"defaultSystemChatPrompt": "",
- "defaultConfig": {}
+ "defaultConfig": {},
+ "fieldMap": {}
},
{
+ "provider": "OpenAI",
"model": "o1-mini",
"name": "o1-mini",
- "avatar": "/imgs/model/openai.svg",
"maxContext": 125000,
- "maxResponse": 4000,
+ "maxResponse": 65000,
"quoteMaxToken": 120000,
"maxTemperature": 1.2,
"charsPointsPrice": 0,
@@ -99,11 +101,11 @@ weight: 708
}
},
{
+ "provider": "OpenAI",
"model": "o1-preview",
"name": "o1-preview",
- "avatar": "/imgs/model/openai.svg",
"maxContext": 125000,
- "maxResponse": 4000,
+ "maxResponse": 32000,
"quoteMaxToken": 120000,
"maxTemperature": 1.2,
"charsPointsPrice": 0,
@@ -126,21 +128,18 @@ weight: 708
],
"vectorModels": [
{
- "model": "text-embedding-ada-002", // 模型名(与OneAPI对应)
- "name": "Embedding-2", // 模型展示名
- "avatar": "/imgs/model/openai.svg", // logo
- "charsPointsPrice": 0, // n积分/1k token
- "defaultToken": 700, // 默认文本分割时候的 token
- "maxToken": 3000, // 最大 token
- "weight": 100, // 优先训练权重
- "defaultConfig": {}, // 自定义额外参数。例如,如果希望使用 embedding3-large 的话,可以传入 dimensions:1024,来返回1024维度的向量。(目前必须小于1536维度)
- "dbConfig": {}, // 存储时的额外参数(非对称向量模型时候需要用到)
- "queryConfig": {} // 参训时的额外参数
+ "provider": "OpenAI",
+ "model": "text-embedding-3-small",
+ "name": "text-embedding-3-small",
+ "charsPointsPrice": 0,
+ "defaultToken": 512,
+ "maxToken": 3000,
+ "weight": 100
},
{
+ "provider": "OpenAI",
"model": "text-embedding-3-large",
"name": "text-embedding-3-large",
- "avatar": "/imgs/model/openai.svg",
"charsPointsPrice": 0,
"defaultToken": 512,
"maxToken": 3000,
@@ -150,13 +149,16 @@ weight: 708
}
},
{
- "model": "text-embedding-3-small",
- "name": "text-embedding-3-small",
- "avatar": "/imgs/model/openai.svg",
- "charsPointsPrice": 0,
- "defaultToken": 512,
- "maxToken": 3000,
- "weight": 100
+ "provider": "OpenAI",
+ "model": "text-embedding-ada-002", // 模型名(与OneAPI对应)
+ "name": "Embedding-2", // 模型展示名
+ "charsPointsPrice": 0, // n积分/1k token
+ "defaultToken": 700, // 默认文本分割时候的 token
+ "maxToken": 3000, // 最大 token
+ "weight": 100, // 优先训练权重
+ "defaultConfig": {}, // 自定义额外参数。例如,如果希望使用 embedding3-large 的话,可以传入 dimensions:1024,来返回1024维度的向量。(目前必须小于1536维度)
+ "dbConfig": {}, // 存储时的额外参数(非对称向量模型时候需要用到)
+ "queryConfig": {} // 参训时的额外参数
}
],
"reRankModels": [],
@@ -183,25 +185,33 @@ weight: 708
}
```
-## 关于模型 logo
+## 模型提供商
+
+为了方便模型分类展示,FastGPT 内置了部分模型提供商的名字和 Logo。如果你期望补充提供商,可[提交 Issue](https://github.com/labring/FastGPT/issues),并提供几个信息:
+
+1. 厂商官网地址
+2. 厂商 SVG logo,建议是正方形图片。
+
+目前已支持的提供商, 复制 "-" 之前的字符串,作为 provider 的值。
-统一放置在项目的`public/imgs/model/xxx`目录中,目前内置了以下几种,如果有需要,可以PR增加。默认logo为 Hugging face 的 logo~
+- OpenAI
+- Claude
+- Gemini
+- MistralAI
+- Qwen - 通义千问
+- Doubao - 豆包
+- ChatGLM - 智谱
+- DeepSeek - 深度求索
+- Moonshot - 月之暗面
+- MiniMax
+- SparkDesk - 讯飞星火
+- Hunyuan - 腾讯混元
+- Baichuan - 百川
+- Yi - 零一万物
+- Ernie - 文心一言
+- Ollama
+- Other - 其他
-- /imgs/model/baichuan.svg - 百川智能
-- /imgs/model/chatglm.svg - 智谱清言
-- /imgs/model/claude.svg - claude
-- /imgs/model/deepseek.svg - deepseek
-- /imgs/model/doubao.svg - 火山豆包
-- /imgs/model/ernie.svg - 文心一言
-- /imgs/model/gemini.svg - gemini
-- /imgs/model/huggingface.svg - Hugging face【默认logo】
-- /imgs/model/minimax.svg - minimax
-- /imgs/model/moonshot.svg - 月之暗面
-- /imgs/model/openai.svg - OpenAI GPT
-- /imgs/model/qwen.svg - 通义千问
-- /imgs/model/sparkDesk.svg - 讯飞星火
-- /imgs/model/yi.svg - 零一万物
-- /imgs/model/hunyuan.svg - 腾讯混元
## 特殊模型
diff --git a/docSite/content/zh-cn/docs/development/upgrading/4816.md b/docSite/content/zh-cn/docs/development/upgrading/4816.md
index 702d7987c825..9760f7840ed9 100644
--- a/docSite/content/zh-cn/docs/development/upgrading/4816.md
+++ b/docSite/content/zh-cn/docs/development/upgrading/4816.md
@@ -7,6 +7,46 @@ toc: true
weight: 808
---
+## 更新指南
+
+### 1. 更新镜像:
+
+- 更新 fastgpt 镜像 tag: v4.8.16-beta
+- 更新 fastgpt-pro 商业版镜像 tag: v4.8.16-beta
+- Sandbox 镜像 tag: v4.8.16-beta
+
+### 2. 更新配置文件
+
+参考最新的[配置文件](/docs/development/configuration/),更新 `config.json` 或 admin 中模型文件配置。给 LLMModel 和 VectorModel 增加 `provider` 字段,以便进行模型分类。例如:
+
+```json
+{
+ "provider": "OpenAI", // 这是新增的
+ "model": "gpt-4o",
+ "name": "gpt-4o",
+ "maxContext": 125000,
+ "maxResponse": 4000,
+ "quoteMaxToken": 120000,
+ "maxTemperature": 1.2,
+ "charsPointsPrice": 0,
+ "censor": false,
+ "vision": true,
+ "datasetProcess": true,
+ "usedInClassify": true,
+ "usedInExtractFields": true,
+ "usedInToolCall": true,
+ "usedInQueryExtension": true,
+ "toolChoice": true,
+ "functionCall": false,
+ "customCQPrompt": "",
+ "customExtractPrompt": "",
+ "defaultSystemChatPrompt": "",
+ "defaultConfig": {},
+ "fieldMap": {}
+}
+```
+
+
## 完整更新内容
@@ -18,12 +58,14 @@ weight: 808
6. 新增 - 商业版支持飞书和语雀知识库导入。[点击查看教程](/docs/guide/knowledge_base/lark_dataset/)
7. 新增 - sandbox 新增 createHmac 加密全局方法。
8. 新增 - 工作流右键支持全部折叠。
-9. 优化 - 工作流/简易模式变量初始化代码,去除监听初始化,避免因渲染顺序不一致导致的失败。
-10. 优化 - 工作流获取数据类型不一致数据时,增加类型转化,避免 undefined。
-11. 修复 - 无法自动切换默认语言。增加分享链接,强制执行一次切换默认语言。
-12. 修复 - 数组选择器自动兼容 4.8.13 以前的数据。
-13. 修复 - 站点同步知识库,链接同步时未使用选择器。
-14. 修复 - 简易模式转工作流,没有把系统配置项转化。
-15. 修复 - 插件独立运行,变量初始值未赋上。
-16. 修复 - 工作流使用弹窗组件时,关闭弹窗后,有时候会出现页面偏移。
-17. 修复 - 插件调试时,日志未保存插件输入参数。
\ No newline at end of file
+9. 优化 - 模型选择器。
+10. 优化 - SSR 渲染,预判断是移动端还是 pc 端,减少页面抖动。
+11. 优化 - 工作流/简易模式变量初始化代码,去除监听初始化,避免因渲染顺序不一致导致的失败。
+12. 优化 - 工作流获取数据类型不一致数据时,增加类型转化,避免 undefined。
+13. 修复 - 无法自动切换默认语言。增加分享链接,强制执行一次切换默认语言。
+14. 修复 - 数组选择器自动兼容 4.8.13 以前的数据。
+15. 修复 - 站点同步知识库,链接同步时未使用选择器。
+16. 修复 - 简易模式转工作流,没有把系统配置项转化。
+17. 修复 - 插件独立运行,变量初始值未赋上。
+18. 修复 - 工作流使用弹窗组件时,关闭弹窗后,有时候会出现页面偏移。
+19. 修复 - 插件调试时,日志未保存插件输入参数。
\ No newline at end of file
diff --git a/packages/global/common/system/constants.ts b/packages/global/common/system/constants.ts
index 5c6b192d6075..1ca44a6118d7 100644
--- a/packages/global/common/system/constants.ts
+++ b/packages/global/common/system/constants.ts
@@ -2,3 +2,5 @@ export const HUMAN_ICON = `/icon/human.svg`;
export const LOGO_ICON = `/icon/logo.svg`;
export const HUGGING_FACE_ICON = `/imgs/model/huggingface.svg`;
export const DEFAULT_TEAM_AVATAR = `/imgs/avatar/defaultTeamAvatar.svg`;
+
+export const isProduction = process.env.NODE_ENV === 'production';
diff --git a/packages/global/core/ai/model.d.ts b/packages/global/core/ai/model.d.ts
index 1d31fa83c748..38687fbc2a6d 100644
--- a/packages/global/core/ai/model.d.ts
+++ b/packages/global/core/ai/model.d.ts
@@ -1,7 +1,10 @@
+import type { ModelProviderIdType } from './provider';
+
export type LLMModelItemType = {
+ provider: ModelProviderIdType;
model: string;
name: string;
- avatar?: string;
+ avatar?: string; // model icon, from provider
maxContext: number;
maxResponse: number;
quoteMaxToken: number;
@@ -31,6 +34,7 @@ export type LLMModelItemType = {
};
export type VectorModelItemType = {
+ provider: ModelProviderIdType;
model: string; // model name
name: string; // show name
avatar?: string;
diff --git a/packages/global/core/ai/model.ts b/packages/global/core/ai/model.ts
index f40e31354d1b..ff6d07f59331 100644
--- a/packages/global/core/ai/model.ts
+++ b/packages/global/core/ai/model.ts
@@ -1,7 +1,9 @@
import type { LLMModelItemType, VectorModelItemType } from './model.d';
+import { getModelProvider, ModelProviderIdType } from './provider';
export const defaultQAModels: LLMModelItemType[] = [
{
+ provider: 'OpenAI',
model: 'gpt-4o-mini',
name: 'gpt-4o-mini',
maxContext: 16000,
@@ -23,6 +25,7 @@ export const defaultQAModels: LLMModelItemType[] = [
export const defaultVectorModels: VectorModelItemType[] = [
{
+ provider: 'OpenAI',
model: 'text-embedding-3-small',
name: 'Embedding-2',
charsPointsPrice: 0,
@@ -31,3 +34,15 @@ export const defaultVectorModels: VectorModelItemType[] = [
weight: 100
}
];
+
+export const getModelFromList = (
+ modelList: { provider: ModelProviderIdType; name: string; model: string }[],
+ model: string
+) => {
+ const modelData = modelList.find((item) => item.model === model) ?? modelList[0];
+ const provider = getModelProvider(modelData.provider);
+ return {
+ ...modelData,
+ avatar: provider.avatar
+ };
+};
diff --git a/packages/global/core/ai/provider.ts b/packages/global/core/ai/provider.ts
new file mode 100644
index 000000000000..8ca7bfcaa587
--- /dev/null
+++ b/packages/global/core/ai/provider.ts
@@ -0,0 +1,121 @@
+import { i18nT } from '../../../web/i18n/utils';
+
+export type ModelProviderIdType =
+ | 'OpenAI'
+ | 'Claude'
+ | 'Gemini'
+ | 'MistralAI'
+ | 'Qwen'
+ | 'Doubao'
+ | 'ChatGLM'
+ | 'DeepSeek'
+ | 'Moonshot'
+ | 'MiniMax'
+ | 'SparkDesk'
+ | 'Hunyuan'
+ | 'Baichuan'
+ | 'Yi'
+ | 'Ernie'
+ | 'Ollama'
+ | 'Other';
+
+export type ModelProviderType = {
+ id: ModelProviderIdType;
+ name: string;
+ avatar: string;
+};
+
+export const ModelProviderList: ModelProviderType[] = [
+ {
+ id: 'OpenAI',
+ name: 'OpenAI',
+ avatar: 'model/openai'
+ },
+ {
+ id: 'Claude',
+ name: 'Claude',
+ avatar: 'model/claude'
+ },
+ {
+ id: 'Gemini',
+ name: 'Gemini',
+ avatar: 'model/gemini'
+ },
+ {
+ id: 'MistralAI',
+ name: 'MistralAI',
+ avatar: 'model/huggingface'
+ },
+ {
+ id: 'Qwen',
+ name: i18nT('common:model_qwen'),
+ avatar: 'model/qwen'
+ },
+ {
+ id: 'Doubao',
+ name: i18nT('common:model_doubao'),
+ avatar: 'model/doubao'
+ },
+ {
+ id: 'ChatGLM',
+ name: i18nT('common:model_chatglm'),
+ avatar: 'model/chatglm'
+ },
+ {
+ id: 'DeepSeek',
+ name: 'DeepSeek',
+ avatar: 'model/deepseek'
+ },
+ {
+ id: 'Moonshot',
+ name: i18nT('common:model_moonshot'),
+ avatar: 'model/moonshot'
+ },
+ {
+ id: 'MiniMax',
+ name: 'MiniMax',
+ avatar: 'model/minimax'
+ },
+ {
+ id: 'SparkDesk',
+ name: i18nT('common:model_sparkdesk'),
+ avatar: 'model/sparkDesk'
+ },
+ {
+ id: 'Hunyuan',
+ name: i18nT('common:model_hunyuan'),
+ avatar: 'model/hunyuan'
+ },
+ {
+ id: 'Baichuan',
+ name: i18nT('common:model_baichuan'),
+ avatar: 'model/baichuan'
+ },
+ {
+ id: 'Yi',
+ name: i18nT('common:model_yi'),
+ avatar: 'model/yi'
+ },
+ {
+ id: 'Ernie',
+ name: i18nT('common:model_ernie'),
+ avatar: 'model/ernie'
+ },
+ {
+ id: 'Ollama',
+ name: 'Ollama',
+ avatar: 'model/ollama'
+ },
+ {
+ id: 'Other',
+ name: i18nT('common:model_other'),
+ avatar: 'model/huggingface'
+ }
+];
+export const ModelProviderMap = Object.fromEntries(
+ ModelProviderList.map((item) => [item.id, item])
+);
+
+export const getModelProvider = (provider: ModelProviderIdType) => {
+ return ModelProviderMap[provider] ?? ModelProviderMap.Other;
+};
diff --git a/packages/service/common/file/constants.ts b/packages/service/common/file/constants.ts
index a3449c4beb52..3245e5f8dbc1 100644
--- a/packages/service/common/file/constants.ts
+++ b/packages/service/common/file/constants.ts
@@ -1,6 +1,6 @@
import path from 'path';
+import { isProduction } from '@fastgpt/global/common/system/constants';
-export const tmpFileDirPath =
- process.env.NODE_ENV === 'production' ? '/app/tmp' : path.join(process.cwd(), 'tmp');
+export const tmpFileDirPath = isProduction ? '/app/tmp' : path.join(process.cwd(), 'tmp');
export const previewMaxCharCount = 3000;
diff --git a/packages/service/common/file/utils.ts b/packages/service/common/file/utils.ts
index 938187f96065..3a623e597e01 100644
--- a/packages/service/common/file/utils.ts
+++ b/packages/service/common/file/utils.ts
@@ -1,4 +1,4 @@
-import { isProduction } from '../system/constants';
+import { isProduction } from '@fastgpt/global/common/system/constants';
import fs from 'fs';
import path from 'path';
diff --git a/packages/service/common/system/constants.ts b/packages/service/common/system/constants.ts
index af250cfdc4f1..1fe15f292acf 100644
--- a/packages/service/common/system/constants.ts
+++ b/packages/service/common/system/constants.ts
@@ -1,3 +1 @@
export const FastGPTProUrl = process.env.PRO_URL ? `${process.env.PRO_URL}/api` : '';
-
-export const isProduction = process.env.NODE_ENV === 'production';
diff --git a/packages/web/common/system/nextjs.ts b/packages/web/common/system/nextjs.ts
new file mode 100644
index 000000000000..60b0c7bac532
--- /dev/null
+++ b/packages/web/common/system/nextjs.ts
@@ -0,0 +1,15 @@
+import { I18nNsType } from '../../types/i18next';
+import { serverSideTranslations } from 'next-i18next/serverSideTranslations';
+
+export const serviceSideProps = async (content: any, ns: I18nNsType = []) => {
+ const lang = content.req?.cookies?.NEXT_LOCALE || content.locale;
+ const extraLng = content.req?.cookies?.NEXT_LOCALE ? undefined : content.locales;
+
+ // Device size
+ const deviceSize = content.req?.cookies?.NEXT_DEVICE_SIZE || 'pc';
+
+ return {
+ ...(await serverSideTranslations(lang, ['common', ...ns], null, extraLng)),
+ deviceSize
+ };
+};
diff --git a/packages/web/components/common/Icon/constants.ts b/packages/web/components/common/Icon/constants.ts
index 1308d0f1e043..51c616371daf 100644
--- a/packages/web/components/common/Icon/constants.ts
+++ b/packages/web/components/common/Icon/constants.ts
@@ -29,6 +29,7 @@ export const iconPaths = {
'common/courseLight': () => import('./icons/common/courseLight.svg'),
'common/customTitleLight': () => import('./icons/common/customTitleLight.svg'),
'common/data': () => import('./icons/common/data.svg'),
+ 'common/dingtalkFill': () => import('./icons/common/dingtalkFill.svg'),
'common/editor/resizer': () => import('./icons/common/editor/resizer.svg'),
'common/errorFill': () => import('./icons/common/errorFill.svg'),
'common/file/move': () => import('./icons/common/file/move.svg'),
@@ -91,7 +92,6 @@ export const iconPaths = {
'common/voiceLight': () => import('./icons/common/voiceLight.svg'),
'common/warn': () => import('./icons/common/warn.svg'),
'common/wechatFill': () => import('./icons/common/wechatFill.svg'),
- 'common/dingtalkFill': () => import('./icons/common/dingtalkFill.svg'),
configmap: () => import('./icons/configmap.svg'),
copy: () => import('./icons/copy.svg'),
'core/app/aiFill': () => import('./icons/core/app/aiFill.svg'),
@@ -256,7 +256,6 @@ export const iconPaths = {
'core/workflow/template/formInput': () => import('./icons/core/workflow/template/formInput.svg'),
'core/workflow/template/getTime': () => import('./icons/core/workflow/template/getTime.svg'),
'core/workflow/template/google': () => import('./icons/core/workflow/template/google.svg'),
- 'core/workflow/template/searxng': () => import('./icons/core/workflow/template/searxng.svg'),
'core/workflow/template/httpRequest': () =>
import('./icons/core/workflow/template/httpRequest.svg'),
'core/workflow/template/ifelse': () => import('./icons/core/workflow/template/ifelse.svg'),
@@ -275,6 +274,7 @@ export const iconPaths = {
'core/workflow/template/readFiles': () => import('./icons/core/workflow/template/readFiles.svg'),
'core/workflow/template/reply': () => import('./icons/core/workflow/template/reply.svg'),
'core/workflow/template/runApp': () => import('./icons/core/workflow/template/runApp.svg'),
+ 'core/workflow/template/searxng': () => import('./icons/core/workflow/template/searxng.svg'),
'core/workflow/template/stopTool': () => import('./icons/core/workflow/template/stopTool.svg'),
'core/workflow/template/systemConfig': () =>
import('./icons/core/workflow/template/systemConfig.svg'),
@@ -341,6 +341,22 @@ export const iconPaths = {
'modal/selectSource': () => import('./icons/modal/selectSource.svg'),
'modal/setting': () => import('./icons/modal/setting.svg'),
'modal/teamPlans': () => import('./icons/modal/teamPlans.svg'),
+ 'model/baichuan': () => import('./icons/model/baichuan.svg'),
+ 'model/chatglm': () => import('./icons/model/chatglm.svg'),
+ 'model/claude': () => import('./icons/model/claude.svg'),
+ 'model/deepseek': () => import('./icons/model/deepseek.svg'),
+ 'model/doubao': () => import('./icons/model/doubao.svg'),
+ 'model/ernie': () => import('./icons/model/ernie.svg'),
+ 'model/gemini': () => import('./icons/model/gemini.svg'),
+ 'model/huggingface': () => import('./icons/model/huggingface.svg'),
+ 'model/hunyuan': () => import('./icons/model/hunyuan.svg'),
+ 'model/minimax': () => import('./icons/model/minimax.svg'),
+ 'model/moonshot': () => import('./icons/model/moonshot.svg'),
+ 'model/ollama': () => import('./icons/model/ollama.svg'),
+ 'model/openai': () => import('./icons/model/openai.svg'),
+ 'model/qwen': () => import('./icons/model/qwen.svg'),
+ 'model/sparkDesk': () => import('./icons/model/sparkDesk.svg'),
+ 'model/yi': () => import('./icons/model/yi.svg'),
more: () => import('./icons/more.svg'),
moreLine: () => import('./icons/moreLine.svg'),
out: () => import('./icons/out.svg'),
diff --git a/projects/app/public/imgs/model/baichuan.svg b/packages/web/components/common/Icon/icons/model/baichuan.svg
similarity index 100%
rename from projects/app/public/imgs/model/baichuan.svg
rename to packages/web/components/common/Icon/icons/model/baichuan.svg
diff --git a/projects/app/public/imgs/model/chatglm.svg b/packages/web/components/common/Icon/icons/model/chatglm.svg
similarity index 100%
rename from projects/app/public/imgs/model/chatglm.svg
rename to packages/web/components/common/Icon/icons/model/chatglm.svg
diff --git a/projects/app/public/imgs/model/claude.svg b/packages/web/components/common/Icon/icons/model/claude.svg
similarity index 100%
rename from projects/app/public/imgs/model/claude.svg
rename to packages/web/components/common/Icon/icons/model/claude.svg
diff --git a/projects/app/public/imgs/model/deepseek.svg b/packages/web/components/common/Icon/icons/model/deepseek.svg
similarity index 100%
rename from projects/app/public/imgs/model/deepseek.svg
rename to packages/web/components/common/Icon/icons/model/deepseek.svg
diff --git a/packages/web/components/common/Icon/icons/model/doubao.svg b/packages/web/components/common/Icon/icons/model/doubao.svg
new file mode 100644
index 000000000000..f964a1a268f2
--- /dev/null
+++ b/packages/web/components/common/Icon/icons/model/doubao.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/projects/app/public/imgs/model/ernie.svg b/packages/web/components/common/Icon/icons/model/ernie.svg
similarity index 100%
rename from projects/app/public/imgs/model/ernie.svg
rename to packages/web/components/common/Icon/icons/model/ernie.svg
diff --git a/projects/app/public/imgs/model/gemini.svg b/packages/web/components/common/Icon/icons/model/gemini.svg
similarity index 100%
rename from projects/app/public/imgs/model/gemini.svg
rename to packages/web/components/common/Icon/icons/model/gemini.svg
diff --git a/projects/app/public/imgs/model/huggingface.svg b/packages/web/components/common/Icon/icons/model/huggingface.svg
similarity index 100%
rename from projects/app/public/imgs/model/huggingface.svg
rename to packages/web/components/common/Icon/icons/model/huggingface.svg
diff --git a/projects/app/public/imgs/model/hunyuan.svg b/packages/web/components/common/Icon/icons/model/hunyuan.svg
similarity index 100%
rename from projects/app/public/imgs/model/hunyuan.svg
rename to packages/web/components/common/Icon/icons/model/hunyuan.svg
diff --git a/projects/app/public/imgs/model/minimax.svg b/packages/web/components/common/Icon/icons/model/minimax.svg
similarity index 100%
rename from projects/app/public/imgs/model/minimax.svg
rename to packages/web/components/common/Icon/icons/model/minimax.svg
diff --git a/projects/app/public/imgs/model/moonshot.svg b/packages/web/components/common/Icon/icons/model/moonshot.svg
similarity index 100%
rename from projects/app/public/imgs/model/moonshot.svg
rename to packages/web/components/common/Icon/icons/model/moonshot.svg
diff --git a/packages/web/components/common/Icon/icons/model/ollama.svg b/packages/web/components/common/Icon/icons/model/ollama.svg
new file mode 100644
index 000000000000..c5f4f94a113e
--- /dev/null
+++ b/packages/web/components/common/Icon/icons/model/ollama.svg
@@ -0,0 +1,119 @@
+
+
+
diff --git a/projects/app/public/imgs/model/openai.svg b/packages/web/components/common/Icon/icons/model/openai.svg
similarity index 100%
rename from projects/app/public/imgs/model/openai.svg
rename to packages/web/components/common/Icon/icons/model/openai.svg
diff --git a/packages/web/components/common/Icon/icons/model/qwen.svg b/packages/web/components/common/Icon/icons/model/qwen.svg
new file mode 100644
index 000000000000..c46b8f052017
--- /dev/null
+++ b/packages/web/components/common/Icon/icons/model/qwen.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/projects/app/public/imgs/model/sparkDesk.svg b/packages/web/components/common/Icon/icons/model/sparkDesk.svg
similarity index 100%
rename from projects/app/public/imgs/model/sparkDesk.svg
rename to packages/web/components/common/Icon/icons/model/sparkDesk.svg
diff --git a/projects/app/public/imgs/model/yi.svg b/packages/web/components/common/Icon/icons/model/yi.svg
similarity index 89%
rename from projects/app/public/imgs/model/yi.svg
rename to packages/web/components/common/Icon/icons/model/yi.svg
index 06372ab65af2..4607c3dad747 100644
--- a/projects/app/public/imgs/model/yi.svg
+++ b/packages/web/components/common/Icon/icons/model/yi.svg
@@ -1,4 +1,4 @@
-