4.8.16 test (#3442)

* perf: simple app save

* fix: notify config i18n

* perf: service side props render

* perf: model selector

* update doc
This commit is contained in:
Archer
2024-12-20 18:58:40 +08:00
committed by GitHub
parent 922cb433d3
commit e6d53e3daa
77 changed files with 878 additions and 326 deletions

View File

@@ -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
## 模型提供商
统一放置在项目的`public/imgs/model/xxx`目录中目前内置了以下几种如果有需要可以PR增加。默认logo为 Hugging face 的 logo~
为了方便模型分类展示FastGPT 内置了部分模型提供商的名字和 Logo。如果你期望补充提供商可[提交 Issue](https://github.com/labring/FastGPT/issues),并提供几个信息:
1. 厂商官网地址
2. 厂商 SVG logo建议是正方形图片。
目前已支持的提供商, 复制 "-" 之前的字符串,作为 provider 的值。
- 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 - 腾讯混元
## 特殊模型

View File

@@ -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. 修复 - 插件调试时,日志未保存插件输入参数
9. 优化 - 模型选择器
10. 优化 - SSR 渲染,预判断是移动端还是 pc 端,减少页面抖动
11. 优化 - 工作流/简易模式变量初始化代码,去除监听初始化,避免因渲染顺序不一致导致的失败
12. 优化 - 工作流获取数据类型不一致数据时,增加类型转化,避免 undefined
13. 修复 - 无法自动切换默认语言。增加分享链接,强制执行一次切换默认语言
14. 修复 - 数组选择器自动兼容 4.8.13 以前的数据
15. 修复 - 站点同步知识库,链接同步时未使用选择器
16. 修复 - 简易模式转工作流,没有把系统配置项转化
17. 修复 - 插件独立运行,变量初始值未赋上
18. 修复 - 工作流使用弹窗组件时,关闭弹窗后,有时候会出现页面偏移。
19. 修复 - 插件调试时,日志未保存插件输入参数。

View File

@@ -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';

View File

@@ -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;

View File

@@ -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
};
};

View File

@@ -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;
};

View File

@@ -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;

View File

@@ -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';

View File

@@ -1,3 +1 @@
export const FastGPTProUrl = process.env.PRO_URL ? `${process.env.PRO_URL}/api` : '';
export const isProduction = process.env.NODE_ENV === 'production';

View File

@@ -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
};
};

View File

@@ -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'),

View File

Before

Width:  |  Height:  |  Size: 2.7 KiB

After

Width:  |  Height:  |  Size: 2.7 KiB

View File

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

Before

Width:  |  Height:  |  Size: 619 B

After

Width:  |  Height:  |  Size: 619 B

View File

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@@ -0,0 +1 @@
<svg t="1734679654271" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="7734" width="64" height="64"><path d="M604.814264 81.402675a1319.065676 1319.065676 0 0 1 36.517088 237.361069c-88.649795-11.49071-173.856333 0.427554-255.619614 35.756315a427.093207 427.093207 0 0 0-59.340267 34.23477 450.161355 450.161355 0 0 0-66.947994 49.450223C170.040297 521.839834 103.600499 620.994377 60.10104 735.667162c-0.715126-140.51471 0.045646-281.003554 2.282318-421.468054C76.803043 215.078039 122.195305 133.675364 198.561664 69.991085c95.178746-71.853456 199.150502-87.575584 311.916791-47.167905 35.223774 13.789765 66.669551 33.315756 94.335809 58.579495z" fill="#A569FF" p-id="7735"></path><path d="M604.814264 81.402675a56768.782835 56768.782835 0 0 0 346.912333 352.998514c-94.145617-61.14482-197.102502-99.183453-308.8737-114.115899-1.014871 0-1.521545-0.506675-1.521545-1.521546a1319.065676 1319.065676 0 0 0-36.517088-237.361069z" fill="#2038FB" p-id="7736"></path><path d="M641.331352 318.763744c0 1.014871 0.506675 1.521545 1.521545 1.521546 7.105617 102.384785 3.301753 204.328321-11.411589 305.830609-13.789765 84.228184-40.416808 163.855215-79.88113 238.882615a499.523328 499.523328 0 0 1-103.465081 35.756315c-131.312404 17.313664-206.122223-39.744285-224.427935-171.173848-8.108315-103.991536 14.20819-200.863762 66.947994-290.615156a679.070241 679.070241 0 0 1 35.756315-50.210996 427.093207 427.093207 0 0 1 59.340267-34.23477c81.763281-35.328761 166.969819-47.247025 255.619614-35.756315z" fill="#FEFEFE" p-id="7737"></path><path d="M642.852897 320.28529c111.771198 14.932446 214.728083 52.971079 308.8737 114.115899 1.240059 2.034306 3.015703 3.555851 5.325409 4.564636 6.883471 14.958312 10.18066 30.681961 9.890045 47.167905-3.882984 72.767905-26.95874 138.70255-69.230313 197.800891-44.500636 59.716089-96.993949 111.196053-157.47994 154.43685-86.741777 63.043709-180.570912 113.508802-281.485884 151.393759 36.800095-37.296119 67.739198-78.886039 92.814264-124.766716 39.464321-75.0274 66.091364-154.654431 79.88113-238.882615 14.713343-101.502288 18.517207-203.445825 11.411589-305.830609z" fill="#37E0BE" p-id="7738"></path><path d="M326.371471 388.754829a679.070241 679.070241 0 0 0-35.756315 50.210996c-52.739804 89.751394-75.056309 186.62362-66.947994 290.615156 18.305712 131.429563 93.11553 188.487513 224.427935 171.173848a499.523328 499.523328 0 0 0 103.465081-35.756315c-25.075067 45.880678-56.014169 87.470597-92.814264 124.766716-39.120452 18.194639-80.202175 29.099554-123.245171 32.713225-87.99553 4.042746-161.790478-26.134062-221.384844-90.531947-45.209676-57.563103-63.215643-122.989551-54.014859-196.279346 43.499459-114.672785 109.939257-213.827328 199.322437-297.46211a450.161355 450.161355 0 0 1 66.947994-49.450223z" fill="#1F37FB" p-id="7739"></path></svg>

After

Width:  |  Height:  |  Size: 2.8 KiB

View File

Before

Width:  |  Height:  |  Size: 4.4 KiB

After

Width:  |  Height:  |  Size: 4.4 KiB

View File

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

Before

Width:  |  Height:  |  Size: 2.5 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

View File

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

Before

Width:  |  Height:  |  Size: 2.4 KiB

After

Width:  |  Height:  |  Size: 2.4 KiB

View File

Before

Width:  |  Height:  |  Size: 3.5 KiB

After

Width:  |  Height:  |  Size: 3.5 KiB

View File

@@ -0,0 +1,119 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="181px" height="256px" viewBox="0 0 181 256" enable-background="new 0 0 181 256" xml:space="preserve"> <image id="image0" width="181" height="256" x="0" y="0"
xlink:href="data:image/png;base64,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
MDYrMDA6MDAeYvBBAAAAAElFTkSuQmCC" />
</svg>

After

Width:  |  Height:  |  Size: 9.1 KiB

View File

Before

Width:  |  Height:  |  Size: 6.6 KiB

After

Width:  |  Height:  |  Size: 6.6 KiB

View File

@@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1734679619961" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4292" xmlns:xlink="http://www.w3.org/1999/xlink" width="64" height="64"><path d="M955 607.2L843.6 412.1l47.8-91.6c6.6-8.7 8.3-21.5 5.6-31.8L835.7 178c-4.7-7.3-12.8-11.8-21.5-12H586.3l-51-89.2c-3.6-7-10.5-11.8-18.3-12.7H396.7c-8.9 0.2-15.2 6.7-19.6 14.4l-1.9 3.1-113.8 195.1H152.2c-9-0.2-17.5 4.3-22.3 12L67 400.1c-4 8-4 17.5 0 25.5l113.1 196.7-51 89.2c-4 8-4 17.4 0 25.5l58.1 102c4.7 7.8 13.2 12.7 22.3 12.7h227.8l54.9 95.5c4.2 7.2 11.6 11.9 19.9 12.8h129c8.9-0.2 17.1-5 21.5-12.7L775 750.5h100.4c8.9-0.8 16.9-5.8 21.5-13.5L955 634.3c5.4-8.3 5.4-18.9 0-27.1zM814.1 620L756 512.5 517 933.7l-65.3-107.5H212.8l57.4-104.3H392L153 302.2h125L396.7 90.3l59.7 104.3-61.3 107.5H873l-60.5 106.8 120.3 211H814.1z" fill="#605BEC" p-id="4293"></path><path d="M511.4 660.5l149-238.9H361.7l149.7 238.9z m0 0" fill="#605BEC" p-id="4294"></path></svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

Before

Width:  |  Height:  |  Size: 3.8 KiB

After

Width:  |  Height:  |  Size: 3.8 KiB

View File

@@ -1,4 +1,4 @@
<svg width="600" height="600" viewBox="0 0 600 600" fill="none" xmlns="http://www.w3.org/2000/svg">
<svg viewBox="0 0 600 600" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="300" cy="300" r="300" fill="white" />
<rect x="409.733" y="340.032" width="42.3862" height="151.648" rx="21.1931" fill="#003425" />
<path fill-rule="evenodd" clip-rule="evenodd"

Before

Width:  |  Height:  |  Size: 917 B

After

Width:  |  Height:  |  Size: 892 B

View File

@@ -8,6 +8,7 @@ import MyImage from './MyImage';
const MyPhotoView = ({ ...props }: ImageProps) => {
const { isPc } = useSystem();
return (
<PhotoProvider
maskOpacity={0.6}

View File

@@ -1,5 +1,16 @@
import React, { useRef, useCallback, useState, useMemo } from 'react';
import { Button, useDisclosure, Box, Flex, useOutsideClick, Checkbox } from '@chakra-ui/react';
import React, { useRef, useCallback, useState, useMemo, useEffect } from 'react';
import {
Button,
useDisclosure,
Box,
Flex,
useOutsideClick,
Checkbox,
css,
Menu,
MenuButton,
MenuList
} from '@chakra-ui/react';
import { ListItemType, MultipleArraySelectProps, MultipleSelectProps } from './type';
import EmptyTip from '../EmptyTip';
import { useTranslation } from 'next-i18next';
@@ -14,18 +25,31 @@ export const MultipleRowSelect = ({
maxH = 300,
onSelect,
popDirection = 'bottom',
styles,
ButtonProps,
changeOnEverySelect = false
}: MultipleSelectProps) => {
const { t } = useTranslation();
const ref = useRef<HTMLDivElement>(null);
const ButtonRef = useRef<HTMLButtonElement>(null);
const { isOpen, onOpen, onClose } = useDisclosure();
const [cloneValue, setCloneValue] = useState(value);
useOutsideClick({
ref: ref,
handler: onClose
});
const MenuRef = useRef<(HTMLDivElement | null)[]>([]);
const SelectedItemRef = useRef<(HTMLDivElement | null)[]>([]);
useEffect(() => {
if (isOpen) {
for (let i = 0; i < MenuRef.current.length; i++) {
const menu = MenuRef.current[i];
const selectedItem = SelectedItemRef.current[i];
if (menu && selectedItem) {
menu.scrollTop = selectedItem.offsetTop - menu.offsetTop - 100;
}
}
}
}, [isOpen]);
const minWidth = `${MenuRef.current?.[0]?.offsetWidth || 0}px`;
const RenderList = useCallback(
({ index, list }: { index: number; list: MultipleSelectProps['list'] }) => {
@@ -37,11 +61,14 @@ export const MultipleRowSelect = ({
return (
<>
<Box
ref={(ref) => {
MenuRef.current[index] = ref;
}}
className="nowheel"
flex={'1 0 auto'}
// width={0}
px={2}
borderLeft={index !== 0 ? 'base' : 'none'}
minW={index !== 0 ? minWidth : 'auto'}
maxH={`${maxH}px`}
overflowY={'auto'}
whiteSpace={'nowrap'}
@@ -49,13 +76,17 @@ export const MultipleRowSelect = ({
{list.map((item) => (
<Flex
key={item.value}
ref={(ref) => {
if (item.value === selectedValue) {
SelectedItemRef.current[index] = ref;
}
}}
py={2}
cursor={'pointer'}
px={2}
borderRadius={'md'}
_hover={{
bg: 'primary.50',
color: 'primary.600'
bg: 'primary.50'
}}
onClick={() => {
const newValue = [...cloneValue];
@@ -81,6 +112,7 @@ export const MultipleRowSelect = ({
}}
{...(item.value === selectedValue
? {
bg: 'primary.50',
color: 'primary.600'
}
: {})}
@@ -109,60 +141,73 @@ export const MultipleRowSelect = ({
}, [value, onOpen]);
return (
<Box ref={ref} position={'relative'}>
<Button
justifyContent={'space-between'}
width={'100%'}
variant={'whitePrimaryOutline'}
size={'lg'}
fontSize={'sm'}
px={3}
outline={'none'}
rightIcon={<MyIcon name={'core/chat/chevronDown'} w="1rem" color={'myGray.500'} />}
_active={{
transform: 'none'
}}
{...(isOpen
? {
borderColor: 'primary.600',
color: 'primary.700',
boxShadow: '0px 0px 0px 2.4px rgba(51, 112, 255, 0.15)'
}
: {
borderColor: 'myGray.200',
boxShadow: 'none'
})}
{...styles}
onClick={() => (isOpen ? onClose() : onOpenSelect())}
<Box
css={css({
'& div': {
width: 'auto !important'
}
})}
>
<Menu
autoSelect={false}
isOpen={isOpen}
onOpen={onOpenSelect}
onClose={onClose}
strategy={'fixed'}
matchWidth
>
<Box>{label ?? placeholder}</Box>
</Button>
{isOpen && (
<Box
position={'absolute'}
{...(popDirection === 'top'
<MenuButton
as={Button}
ref={ButtonRef}
width={'100%'}
px={3}
rightIcon={<MyIcon name={'core/chat/chevronDown'} w={4} color={'myGray.500'} />}
variant={'whitePrimaryOutline'}
size={'lg'}
fontSize={'sm'}
textAlign={'left'}
_active={{
transform: 'none'
}}
{...(isOpen
? {
transform: 'translateY(-105%)',
top: '0'
boxShadow: '0px 0px 0px 2.4px rgba(51, 112, 255, 0.15)',
borderColor: 'primary.600',
color: 'primary.700'
}
: {
transform: 'translateY(105%)',
bottom: '0'
})}
py={2}
bg={'white'}
border={'1px solid #fff'}
boxShadow={'5'}
borderRadius={'md'}
zIndex={1}
minW={'100%'}
w={'max-content'}
: {})}
{...ButtonProps}
>
<Flex>
<RenderList list={list} index={0} />
</Flex>
</Box>
)}
<Box>{label ?? placeholder}</Box>
</MenuButton>
<MenuList
className={ButtonProps?.className}
minW={(() => {
const w = ButtonRef.current?.clientWidth;
if (w) {
return `${w}px !important`;
}
const width = ButtonProps?.width;
return Array.isArray(width)
? width.map((item) => `${item} !important`)
: `${width} !important`;
})()}
w={'auto'}
px={'6px'}
py={'6px'}
border={'1px solid #fff'}
boxShadow={
'0px 2px 4px rgba(161, 167, 179, 0.25), 0px 0px 1px rgba(121, 141, 159, 0.25);'
}
zIndex={99}
maxH={'40vh'}
overflowY={'auto'}
display={'flex'}
>
<RenderList list={list} index={0} />
</MenuList>
</Menu>
</Box>
);
};
@@ -176,7 +221,7 @@ export const MultipleRowArraySelect = ({
maxH = 300,
onSelect,
popDirection = 'bottom',
styles
ButtonProps
}: MultipleArraySelectProps) => {
const { t } = useTranslation();
const ref = useRef<HTMLDivElement>(null);
@@ -318,7 +363,7 @@ export const MultipleRowArraySelect = ({
borderColor: 'myGray.200',
boxShadow: 'none'
})}
{...styles}
{...ButtonProps}
onClick={() => (isOpen ? onClose() : onOpenSelect())}
className="nowheel"
>
@@ -343,7 +388,7 @@ export const MultipleRowArraySelect = ({
border={'1px solid #fff'}
boxShadow={'5'}
borderRadius={'md'}
zIndex={1}
zIndex={1000}
minW={'100%'}
w={'max-content'}
>

View File

@@ -1,3 +1,5 @@
import { ButtonProps } from '@chakra-ui/react';
type ListItemType = {
alias?: string;
label: string | React.ReactNode;
@@ -12,9 +14,9 @@ export type MultipleSelectProps = {
emptyTip?: string;
maxH?: number;
onSelect: (val: any[]) => void;
styles?: ButtonProps;
popDirection?: 'top' | 'bottom';
changeOnEverySelect?: boolean;
ButtonProps?: ButtonProps;
};
export type MultipleArraySelectProps = Omit<MultipleSelectProps, 'value'> & {
value?: any[][];

View File

@@ -0,0 +1,45 @@
import React, { ReactNode, useMemo } from 'react';
import { createContext } from 'use-context-selector';
import { useMediaQuery } from '@chakra-ui/react';
import Cookies from 'js-cookie';
import { useEffect } from 'react';
const CookieKey = 'NEXT_DEVICE_SIZE';
const setSize = (value: string) => {
Cookies.set(CookieKey, value, { expires: 30 });
localStorage.setItem(CookieKey, value);
};
type useSystemContextType = {
isPc: boolean;
};
export const useSystemStoreContext = createContext<useSystemContextType>({
isPc: true
});
const SystemStoreContextProvider = ({
children,
device
}: {
children: ReactNode;
device?: 'pc' | 'mobile';
}) => {
const [isPc] = useMediaQuery('(min-width: 900px)');
useEffect(() => {
setSize(isPc ? 'pc' : 'mobile');
}, [isPc]);
const contextValue = useMemo(
() => ({
isPc: device ? device === 'pc' : isPc
}),
[device, isPc]
);
return (
<useSystemStoreContext.Provider value={contextValue}>{children}</useSystemStoreContext.Provider>
);
};
export default SystemStoreContextProvider;

View File

@@ -1,5 +1,6 @@
import { useTranslation } from 'next-i18next';
import { useEffect } from 'react';
import { isProduction } from '@fastgpt/global/common/system/constants';
export const useBeforeunload = (props?: { callback?: () => any; tip?: string }) => {
const { t } = useTranslation();
@@ -7,16 +8,15 @@ export const useBeforeunload = (props?: { callback?: () => any; tip?: string })
const { tip = t('common:common.Confirm to leave the page'), callback } = props || {};
useEffect(() => {
const listen =
process.env.NODE_ENV === 'production'
? (e: any) => {
e.preventDefault();
e.returnValue = tip;
callback?.();
}
: () => {
callback?.();
};
const listen = isProduction
? (e: any) => {
e.preventDefault();
e.returnValue = tip;
callback?.();
}
: () => {
callback?.();
};
window.addEventListener('beforeunload', listen);
return () => {

View File

@@ -1,7 +1,8 @@
import { useMediaQuery } from '@chakra-ui/react';
import { useSystemStoreContext } from '../context/useSystem';
import { useContextSelector } from 'use-context-selector';
export const useSystem = () => {
const [isPc] = useMediaQuery('(min-width: 900px)');
const isPc = useContextSelector(useSystemStoreContext, (state) => state.isPc);
return { isPc };
};

View File

@@ -77,7 +77,7 @@
"usage_balance_notice": "Due to the system upgrade, the original \"automatic renewal and deduction from balance\" mode has been cancelled, and the balance recharge entrance has been closed. \nYour balance can be used to purchase points",
"user_account": "Username",
"user_team_team_name": "Team",
"verification_code_required": "Verification code cannot be empty",
"verification_code": "Verification code",
"you_can_convert": "you can redeem",
"yuan": "Yuan"
}

View File

@@ -906,6 +906,16 @@
"item_name": "Field Name",
"just_now": "just",
"key_repetition": "Key Repetition",
"model_baichuan": "Baichuan",
"model_chatglm": "ChatGLM",
"model_doubao": "Doubao",
"model_ernie": "Ernie",
"model_hunyuan": "Hunyuan",
"model_moonshot": "Moonshot",
"model_other": "Other",
"model_qwen": "Qwen",
"model_sparkdesk": "SprkDesk",
"model_yi": "Yi",
"move.confirm": "Confirm move",
"navbar.Account": "Account",
"navbar.Chat": "Chat",

View File

@@ -77,7 +77,7 @@
"usage_balance_notice": "由于系统升级,原“自动续费从余额扣款”模式取消,余额充值入口关闭。您的余额可用于购买积分",
"user_account": "账号",
"user_team_team_name": "团队名",
"verification_code_required": "验证码不能为空",
"verification_code": "验证码",
"you_can_convert": "您可以兑换",
"yuan": "元"
}

View File

@@ -905,6 +905,16 @@
"item_name": "字段名",
"just_now": "刚刚",
"key_repetition": "key 重复",
"model_baichuan": "百川智能",
"model_chatglm": "ChatGLM",
"model_doubao": "豆包",
"model_ernie": "文心一言",
"model_hunyuan": "腾讯混元",
"model_moonshot": "月之暗面",
"model_other": "自定义",
"model_qwen": "阿里千问",
"model_sparkdesk": "讯飞星火",
"model_yi": "零一万物",
"move.confirm": "确认移动",
"navbar.Account": "账号",
"navbar.Chat": "聊天",

View File

@@ -77,7 +77,7 @@
"usage_balance_notice": "由於系統升級,原「自動續費從餘額扣款」模式取消,餘額儲值入口關閉。\n您的餘額可用於購買積分",
"user_account": "帳號",
"user_team_team_name": "團隊名",
"verification_code_required": "驗證碼不能為空",
"verification_code": "驗證碼",
"you_can_convert": "您可以兌換",
"yuan": "元"
}

View File

@@ -907,6 +907,16 @@
"item_name": "欄位名稱",
"just_now": "剛剛",
"key_repetition": "鍵值重複",
"model_baichuan": "百川智能",
"model_chatglm": "ChatGLM",
"model_doubao": "豆包",
"model_ernie": "文心一言",
"model_hunyuan": "騰訊混元",
"model_moonshot": "月之暗面",
"model_other": "自訂",
"model_qwen": "阿里千問",
"model_sparkdesk": "訊飛星火",
"model_yi": "零一萬物",
"move.confirm": "確認移動",
"navbar.Account": "帳戶",
"navbar.Chat": "對話",

View File

@@ -11,9 +11,9 @@
},
"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, // 最大引用内容
@@ -35,9 +35,9 @@
"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,
@@ -59,9 +59,9 @@
"fieldMap": {}
},
{
"provider": "OpenAI",
"model": "o1-mini",
"name": "o1-mini",
"avatar": "/imgs/model/openai.svg",
"maxContext": 125000,
"maxResponse": 65000,
"quoteMaxToken": 120000,
@@ -84,9 +84,9 @@
}
},
{
"provider": "OpenAI",
"model": "o1-preview",
"name": "o1-preview",
"avatar": "/imgs/model/openai.svg",
"maxContext": 125000,
"maxResponse": 32000,
"quoteMaxToken": 120000,
@@ -111,21 +111,18 @@
],
"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,
@@ -135,13 +132,16 @@
}
},
{
"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": [],

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 25 KiB

View File

@@ -1,27 +0,0 @@
<svg t="1710841166479" class="icon" viewBox="0 0 1040 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1089"
width="128" height="128">
<path
d="M373.508197 8.393443L411.278689 16.786885l37.770491 50.360656 12.590164-4.196721q-19.304918 10.911475 4.196722 20.983606l12.590164-4.196721-4.196722 12.590164q21.822951-5.87541 12.590164 16.786885h16.786885v12.590164l67.147541 109.114754-4.196721 12.590164 12.590164 4.196721-4.196721 12.590164 12.590164 4.196722-193.049181 4.196721 58.754099-104.918033v-25.180328L390.295082 33.57377q-18.465574-5.87541-12.590164 12.590164L251.803279 268.590164H104.918033l-4.196722 12.590164 276.983607 461.639344-130.098361 4.196721-20.983606 20.983607-58.754099 100.721311 117.508197 8.393443-54.557377 20.983607q-79.737705 16.786885-96.52459-29.37705l-58.754098-100.721311v-25.180328l58.754098-109.114754-134.295082-235.016393 67.147541-125.90164 29.377049-29.377049h134.295082l12.590164-12.590164L373.508197 8.393443z"
fill="#4644B0" opacity=".992" p-id="1090"></path>
<path
d="M365.114754 419.672131h235.016394l4.196721 12.590164-8.393443 25.180328q3.357377 95.685246-33.57377 151.081967l4.196721 12.590164q-18.465574-5.87541-12.590164 12.590164v16.786885L516.196721 688.262295 386.098361 474.229508 365.114754 419.672131z"
fill="#4644B0" opacity=".992" p-id="1091"></path>
<path
d="M919.081967 176.262295l8.393443 16.786885-8.393443-16.786885zM944.262295 318.95082l-8.393443 16.786885 8.393443-16.786885zM910.688525 327.344262l-8.393443 16.786886 8.393443-16.786886zM902.295082 386.098361l12.590164 20.983606-16.786885-8.393442 4.196721-12.590164zM927.47541 486.819672l8.393442 16.786885-8.393442-16.786885zM961.04918 495.213115l8.393443 16.786885-8.393443-16.786885zM961.04918 545.57377l8.393443 16.786886-8.393443-16.786886zM1036.590164 621.114754l4.196721 20.983607h-8.393442l4.196721-20.983607zM809.967213 805.770492l-8.393443 16.786885 8.393443-16.786885zM146.885246 881.311475l8.393443 16.786886-8.393443-16.786886zM751.213115 906.491803l-8.393443 16.786886 8.393443-16.786886zM717.639344 965.245902l-8.393442 16.786885 8.393442-16.786885zM516.196721 982.032787l8.393443 16.786885-8.393443-16.786885zM642.098361 1015.606557l37.770491 4.196722-37.770491 4.196721v-8.393443z"
fill="#6C6CEF" opacity=".843" p-id="1092"></path>
<path
d="M373.508197 0l-8.393443 16.786885 8.393443-16.786885zM239.213115 226.622951l-8.393443 16.786885 8.393443-16.786885zM88.131148 243.409836l-16.786886 25.180328 16.786886-25.180328zM100.721311 268.590164l142.688525 4.196721-134.295082 8.393443 4.196721 12.590164-12.590164-25.180328zM46.163934 310.557377l-8.393442 16.786885 8.393442-16.786885zM130.098361 318.95082l8.393442 16.786885-8.393442-16.786885zM12.590164 369.311475L8.393443 381.901639 4.196721 394.491803 0 381.901639 12.590164 369.311475zM163.672131 377.704918l8.393443 16.786885-8.393443-16.786885zM4.196721 402.885246L16.786885 423.868852l-16.786885-8.393442L4.196721 402.885246zM188.852459 419.672131l8.393443 16.786885-8.393443-16.786885zM37.770492 470.032787l8.393442 16.786885-8.393442-16.786885zM222.42623 478.42623l8.393442 16.786885-8.393442-16.786885zM62.95082 512l8.393442 16.786885-8.393442-16.786885zM96.52459 570.754098l8.393443 16.786886-8.393443-16.786886zM247.606557 747.016393l130.098361 4.196722-130.098361 4.196721v-8.393443z"
fill="#413FA6" opacity=".588" p-id="1093"></path>
<path
d="M348.327869 33.57377l-8.393443 16.786886 8.393443-16.786886zM390.295082 33.57377l-16.786885 25.180328 16.786885-25.180328zM323.147541 75.540984l-8.393443 16.786885 8.393443-16.786885zM348.327869 100.721311l-8.393443 16.786886 8.393443-16.786886zM440.655738 125.901639l8.393442 16.786886-8.393442-16.786886zM289.57377 134.295082l-8.393442 16.786885 8.393442-16.786885zM314.754098 159.47541l-8.393442 16.786885 8.393442-16.786885zM432.262295 184.655738l-8.393443 16.786885 8.393443-16.786885zM289.57377 201.442623l-8.393442 16.786885 8.393442-16.786885zM104.918033 235.016393l121.704918 4.196722-121.704918 4.196721v-8.393443zM256 260.196721l-8.393443 16.786886 8.393443-16.786886zM390.295082 268.590164l222.426229 4.196721-222.426229 4.196722v-8.393443zM352.52459 411.278689l201.442623 4.196721-188.852459 4.196721-8.393443 8.393443-4.196721-16.786885zM650.491803 486.819672l-8.393442 16.786885 8.393442-16.786885zM407.081967 512l8.393443 16.786885-8.393443-16.786885zM289.57377 587.540984l8.393443 16.786885-8.393443-16.786885zM591.737705 587.540984l-8.393443 16.786885 8.393443-16.786885zM465.836066 612.721311l8.393442 16.786886-8.393442-16.786886zM323.147541 646.295082l8.393443 16.786885-8.393443-16.786885zM558.163934 646.295082l-8.393442 16.786885 8.393442-16.786885zM88.131148 713.442623l-8.393443 16.786885 8.393443-16.786885zM71.344262 738.622951l4.196722 29.377049H67.147541l4.196721-29.377049zM205.639344 814.163934l-8.393442 16.786886 8.393442-16.786886zM104.918033 822.557377l8.393442 16.786885-8.393442-16.786885zM180.459016 864.52459l264.393443 4.196721-264.393443 4.196722v-8.393443z"
fill="#4847B2" opacity=".176" p-id="1094"></path>
<path
d="M365.114754 0L360.918033 12.590164 348.327869 33.57377l4.196721-12.590163L365.114754 0zM541.377049 0l8.393443 16.786885-8.393443-16.786885zM558.163934 25.180328l8.393443 16.786885-8.393443-16.786885zM390.295082 41.967213l8.393443 16.786885-8.393443-16.786885zM583.344262 67.147541l12.590164 20.983607h-8.393442L583.344262 67.147541zM415.47541 83.934426l8.393442 16.786885-8.393442-16.786885zM608.52459 109.114754h268.590164l29.377049 29.377049-29.377049-20.983606h-268.590164v-8.393443zM910.688525 151.081967l20.983606 29.377049-16.786885-8.393442-4.196721-20.983607zM944.262295 209.836066l20.983607 29.377049-16.786886-8.393443-4.196721-20.983606zM616.918033 268.590164h318.950819l4.196722 12.590164-16.786885 8.393442-4.196722-12.590163h-302.163934v-8.393443zM969.442623 276.983607l4.196721 12.590163-16.786885 8.393443 12.590164-20.983606zM919.081967 302.163934l-4.196721 12.590164-12.590164 20.983607 4.196721-12.590164 12.590164-20.983607zM944.262295 327.344262l-4.196721 12.590164-12.590164 20.983607 4.196721-12.590164 12.590164-20.983607zM885.508197 360.918033l-4.196722 12.590164-8.393442 25.180328 16.786885 25.180327-16.786885-8.393442-8.393443-25.180328 20.983607-29.377049zM919.081967 369.311475l-4.196721 12.590164-4.196721 20.983607-4.196722-20.983607 12.590164-12.590164zM558.163934 411.278689l130.098361 4.196721-130.098361 4.196721v-8.393442zM927.47541 428.065574l20.983606 29.377049-16.786885-8.393443-4.196721-20.983606zM893.901639 436.459016l29.37705 46.163935-25.180328-16.786885-4.196722-29.37705zM952.655738 470.032787l20.983606 29.377049-16.786885-8.393443-4.196721-20.983606zM927.47541 495.213115l20.983606 29.377049-16.786885-8.393443-4.196721-20.983606zM642.098361 503.606557l-8.393443 16.786886 8.393443-16.786886zM788.983607 512l33.57377 20.983607 8.393443 16.786885-16.786886-8.393443-12.590164-20.983606-25.180327 33.57377 4.196721-12.590164 8.393443-29.377049zM986.229508 528.786885l20.983607 29.377049-16.786885-8.393442-4.196722-20.983607zM616.918033 545.57377l-8.393443 16.786886 8.393443-16.786886zM961.04918 553.967213l20.983607 29.377049-16.786885-8.393442-4.196722-20.983607zM768 562.360656l-4.196721 12.590164-4.196722 12.590164-4.196721-12.590164 12.590164-12.590164zM843.540984 579.147541l20.983606 29.377049-16.786885-8.393442-4.196721-20.983607zM1019.803279 587.540984l20.983606 29.377049-16.786885-8.393443-4.196721-20.983606zM986.229508 595.934426l20.983607 41.967213h-130.098361l-12.590164-12.590164 12.590164 4.196722 121.704918-4.196722-12.590164-29.377049zM734.42623 621.114754l-4.196722 12.590164-12.590164 20.983607 4.196722-12.590164 12.590164-20.983607zM1036.590164 646.295082l4.196721 12.590164-20.983606 29.377049 4.196721-12.590164 12.590164-29.377049zM549.770492 663.081967l-8.393443 16.786885 8.393443-16.786885zM700.852459 679.868852l-4.196721 12.590164-12.590164 20.983607-4.196722-12.590164 20.983607-20.983607zM1011.409836 696.655738l-4.196721 12.590164-20.983607 37.770491 4.196722-12.590163 20.983606-37.770492zM675.672131 721.836066l-4.196721 12.590164-4.196721 12.590163-4.196722-12.590163 12.590164-12.590164zM977.836066 755.409836l-25.180328 33.573771-130.098361-4.196722 130.098361-4.196721 25.180328-25.180328zM642.098361 780.590164l-4.196722 12.590164-12.590164 20.983606 4.196722-12.590164 12.590164-20.983606zM809.967213 814.163934l-4.196721 12.590164-12.590164 20.983607 4.196721-12.590164 12.590164-20.983607zM608.52459 839.344262l-4.196721 12.590164-12.590164 20.983607 4.196721-12.590164 12.590164-20.983607zM784.786885 856.131148l-4.196721 12.590163-12.590164 20.983607 4.196721-12.590164 12.590164-20.983606zM449.04918 864.52459l8.393443 16.786885-8.393443-16.786885zM583.344262 881.311475l-4.196721 12.590164-4.196721 12.590164-4.196722-12.590164 12.590164-12.590164zM146.885246 889.704918l20.983606 12.590164-12.590163 4.196721-8.393443-16.786885zM465.836066 889.704918l20.983606 29.377049-16.786885-8.393442-4.196721-20.983607zM180.459016 898.098361l256 4.196721-256 4.196721v-8.393442zM440.655738 914.885246l20.983606 29.377049-16.786885-8.393443-4.196721-20.983606zM751.213115 914.885246l-4.196722 12.590164-12.590163 20.983606 4.196721-12.590164 12.590164-20.983606zM549.770492 940.065574l-4.196722 12.590164-12.590163 20.983606 4.196721-12.590164 12.590164-20.983606zM499.409836 948.459016l29.377049 37.770492-25.180328-16.786885-4.196721-20.983607zM717.639344 973.639344l-4.196721 12.590164-12.590164 20.983607 4.196721-12.590164 12.590164-20.983607zM482.622951 982.032787l12.590164 20.983606-16.786885-8.393442 4.196721-12.590164z"
fill="#6F6FEA" opacity=".227" p-id="1095"></path>
<path
d="M386.098361 0h138.491803L545.57377 8.393443l62.95082 109.114754h260.196721l29.37705 20.983606 67.147541 117.508197v25.180328l-67.147541 117.508197 134.295082 218.229508v33.57377L952.655738 780.590164h-125.90164L814.163934 793.180328 684.065574 1015.606557l-159.47541 8.393443-29.377049-20.983607-62.95082-104.918032-180.459016-4.196722 37.770491-20.983606h159.47541l4.196722 12.590164 71.344262 113.311475 276.983606-478.426229 62.95082 117.508196 151.081967-4.196721-142.688524-243.409836q47.842623-51.2 67.147541-121.704918H591.737705L570.754098 256l4.196722-12.590164-12.590164-4.196721v-16.786885L503.606557 109.114754h-16.786885q9.232787-22.662295-12.590164-16.786885L411.278689 16.786885q-34.413115 10.911475-25.180328-16.786885z"
fill="#6867ED" opacity=".996" p-id="1096"></path>
<path
d="M604.327869 419.672131h71.344262l4.196721 12.590164L566.557377 612.721311l4.196721-12.590163 33.573771-151.081968V419.672131zM558.163934 621.114754l4.196722 12.590164-16.786886 8.393443 12.590164-20.983607zM532.983607 671.47541l-4.196722 12.590164-4.196721 12.590164-4.196721-12.590164 12.590164-12.590164z"
fill="#6867ED" opacity=".996" p-id="1097"></path>
</svg>

Before

Width:  |  Height:  |  Size: 11 KiB

View File

@@ -1,14 +1,16 @@
import React, { useCallback, useMemo } from 'react';
import React, { useCallback, useMemo, useState } from 'react';
import { useTranslation } from 'next-i18next';
import { useSystemStore } from '@/web/common/system/useSystemStore';
import { useRouter } from 'next/router';
import MySelect, { SelectProps } from '@fastgpt/web/components/common/MySelect';
import { HUGGING_FACE_ICON, LOGO_ICON } from '@fastgpt/global/common/system/constants';
import { Box, Flex, useDisclosure } from '@chakra-ui/react';
import { Box, Flex, HStack, useDisclosure } from '@chakra-ui/react';
import Avatar from '@fastgpt/web/components/common/Avatar';
import MyTooltip from '@fastgpt/web/components/common/MyTooltip';
import dynamic from 'next/dynamic';
import { ModelProviderList } from '@fastgpt/global/core/ai/provider';
import MultipleRowSelect from '@fastgpt/web/components/common/MySelect/MultipleRowSelect';
import { getModelFromList } from '@fastgpt/global/core/ai/model';
const AiPointsModal = dynamic(() =>
import('@/pages/price/components/Points').then((mod) => mod.AiPointsModal)
@@ -18,10 +20,9 @@ type Props = SelectProps & {
disableTip?: string;
};
const AIModelSelector = ({ list, onchange, disableTip, ...props }: Props) => {
const OneRowSelector = ({ list, onchange, disableTip, ...props }: Props) => {
const { t } = useTranslation();
const { feConfigs, llmModelList, vectorModelList } = useSystemStore();
const router = useRouter();
const {
isOpen: isOpenAiPointsModal,
@@ -40,9 +41,7 @@ const AIModelSelector = ({ list, onchange, disableTip, ...props }: Props) => {
}, [props.size]);
const avatarList = list.map((item) => {
const modelData =
llmModelList.find((model) => model.model === item.value) ||
vectorModelList.find((model) => model.model === item.value);
const modelData = getModelFromList([...llmModelList, ...vectorModelList], item.value);
return {
value: item.value,
@@ -55,14 +54,14 @@ const AIModelSelector = ({ list, onchange, disableTip, ...props }: Props) => {
fallbackSrc={HUGGING_FACE_ICON}
w={avatarSize}
/>
<Box>{item.label}</Box>
<Box>{modelData.name}</Box>
</Flex>
)
};
});
const expandList = useMemo(() => {
return feConfigs.show_pay
return feConfigs?.show_pay
? avatarList.concat({
label: (
<Flex alignItems={'center'}>
@@ -108,5 +107,121 @@ const AIModelSelector = ({ list, onchange, disableTip, ...props }: Props) => {
</Box>
);
};
const MultipleRowSelector = ({ list, onchange, disableTip, ...props }: Props) => {
const { t } = useTranslation();
const { feConfigs, llmModelList, vectorModelList } = useSystemStore();
const [value, setValue] = useState<string[]>([]);
const {
isOpen: isOpenAiPointsModal,
onClose: onCloseAiPointsModal,
onOpen: onOpenAiPointsModal
} = useDisclosure();
const avatarSize = useMemo(() => {
const size = {
sm: '1rem',
md: '1.2rem',
lg: '1.4rem'
};
//@ts-ignore
return props.size ? size[props.size] : size['md'];
}, [props.size]);
const selectorList = useMemo(() => {
const renderList = ModelProviderList.map<{
label: React.JSX.Element;
value: string;
children: { label: string | React.ReactNode; value: string }[];
}>((provider) => ({
label: (
<Flex alignItems={'center'} py={1}>
<Avatar
borderRadius={'0'}
mr={2}
src={provider?.avatar || HUGGING_FACE_ICON}
fallbackSrc={HUGGING_FACE_ICON}
w={avatarSize}
/>
<Box>{t(provider.name as any)}</Box>
</Flex>
),
value: provider.id,
children: []
}));
for (const item of list) {
const modelData = getModelFromList([...llmModelList, ...vectorModelList], item.value);
const provider =
renderList.find((item) => item.value === (modelData?.provider || 'Other')) ??
renderList[renderList.length - 1];
provider.children.push({
label: modelData.name,
value: modelData.model
});
}
return renderList.filter((item) => item.children.length > 0);
}, [avatarSize, list, llmModelList, t, vectorModelList]);
const onSelect = useCallback(
(e: string[]) => {
return onchange?.(e[1]);
},
[onchange]
);
const SelectedModel = useMemo(() => {
const modelData = getModelFromList([...llmModelList, ...vectorModelList], props.value);
setValue([modelData.provider, props.value]);
return (
<HStack spacing={1}>
<Avatar
borderRadius={'0'}
mr={2}
src={modelData?.avatar}
fallbackSrc={HUGGING_FACE_ICON}
w={avatarSize}
/>
<Box>{modelData?.name}</Box>
</HStack>
);
}, [avatarSize, llmModelList, props.value, vectorModelList]);
return (
<Box
css={{
span: {
display: 'block'
}
}}
>
<MyTooltip label={disableTip}>
<MultipleRowSelect
label={SelectedModel}
list={selectorList}
onSelect={onSelect}
value={value}
ButtonProps={{
isDisabled: !!disableTip
}}
/>
</MyTooltip>
{isOpenAiPointsModal && <AiPointsModal onClose={onCloseAiPointsModal} />}
</Box>
);
};
const AIModelSelector = (props: Props) => {
return props.list.length > 10 ? (
<MultipleRowSelector {...props} />
) : (
<OneRowSelector {...props} />
);
};
export default AIModelSelector;

View File

@@ -1,4 +1,4 @@
import React from 'react';
import React, { useMemo } from 'react';
import { useSystemStore } from '@/web/common/system/useSystemStore';
import { LLMModelTypeEnum, llmModelTypeFilterMap } from '@fastgpt/global/core/ai/constants';
import { Box, Button, css, useDisclosure } from '@chakra-ui/react';
@@ -10,6 +10,7 @@ import MyTooltip from '@fastgpt/web/components/common/MyTooltip';
import { useTranslation } from 'next-i18next';
import MyIcon from '@fastgpt/web/components/common/Icon';
import { useMount } from 'ahooks';
import { getModelFromList } from '@fastgpt/global/core/ai/model';
type Props = {
llmModelType?: `${LLMModelTypeEnum}`;
@@ -29,15 +30,19 @@ const SettingLLMModel = ({
const model = defaultData.model;
const modelList = llmModelList.filter((model) => {
if (!llmModelType) return true;
const filterField = llmModelTypeFilterMap[llmModelType];
if (!filterField) return true;
//@ts-ignore
return !!model[filterField];
});
const modelList = useMemo(
() =>
llmModelList.filter((modelData) => {
if (!llmModelType) return true;
const filterField = llmModelTypeFilterMap[llmModelType];
if (!filterField) return true;
//@ts-ignore
return !!modelData[filterField];
}),
[llmModelList, llmModelType]
);
const selectedModel = modelList.find((item) => item.model === model) || modelList[0];
const selectedModel = useMemo(() => getModelFromList(modelList, model), [modelList, model]);
const {
isOpen: isOpenAIChatSetting,

View File

@@ -14,6 +14,7 @@ import NextHead from '@/components/common/NextHead';
import { ReactElement, useEffect } from 'react';
import { NextPage } from 'next';
import { getWebReqUrl } from '@fastgpt/web/common/system/utils';
import SystemStoreContextProvider from '@fastgpt/web/context/useSystem';
type NextPageWithLayout = NextPage & {
setLayout?: (page: ReactElement) => JSX.Element;
@@ -55,11 +56,13 @@ function App({ Component, pageProps }: AppPropsWithLayout) {
{scripts?.map((item, i) => <Script key={i} strategy="lazyOnload" {...item}></Script>)}
<QueryClientContext>
<I18nContextProvider>
<ChakraUIContext>
<Layout>{setLayout(<Component {...pageProps} />)}</Layout>
</ChakraUIContext>
</I18nContextProvider>
<SystemStoreContextProvider device={pageProps.deviceSize}>
<I18nContextProvider>
<ChakraUIContext>
<Layout>{setLayout(<Component {...pageProps} />)}</Layout>
</ChakraUIContext>
</I18nContextProvider>
</SystemStoreContextProvider>
</QueryClientContext>
</>
);

View File

@@ -1,6 +1,6 @@
import { useEffect } from 'react';
import { useRouter } from 'next/router';
import { serviceSideProps } from '@/web/common/utils/i18n';
import { serviceSideProps } from '@fastgpt/web/common/system/nextjs';
import { useSystemStore } from '@/web/common/system/useSystemStore';
import { Box } from '@chakra-ui/react';
import { TrackEventName } from '@/web/common/system/constants';

View File

@@ -3,7 +3,7 @@ import ApiKeyTable from '@/components/support/apikey/Table';
import { useTranslation } from 'next-i18next';
import { Box } from '@chakra-ui/react';
import AccountContainer, { TabEnum } from './components/AccountContainer';
import { serviceSideProps } from '../../web/common/utils/i18n';
import { serviceSideProps } from '@fastgpt/web/common/system/nextjs';
const ApiKey = () => {
const { t } = useTranslation();

View File

@@ -6,7 +6,7 @@ import { useTranslation } from 'next-i18next';
import ApplyInvoiceModal from './components/ApplyInvoiceModal';
import { useRouter } from 'next/router';
import AccountContainer, { TabEnum } from '../components/AccountContainer';
import { serviceSideProps } from '@/web/common/utils/i18n';
import { serviceSideProps } from '@fastgpt/web/common/system/nextjs';
export enum InvoiceTabEnum {
bill = 'bill',

View File

@@ -1,4 +1,4 @@
import React, { useCallback, useMemo } from 'react';
import React, { useCallback, useMemo, useRef } from 'react';
import { Box, Flex, useTheme } from '@chakra-ui/react';
import { useSystemStore } from '@/web/common/system/useSystemStore';
import { useRouter } from 'next/router';
@@ -42,7 +42,7 @@ const AccountContainer = ({
return router.pathname.split('/').pop() as TabEnum;
}, [router.pathname]);
const tabList = [
const tabList = useRef([
{
icon: 'support/user/userLight',
label: t('account:personal_information'),
@@ -108,7 +108,7 @@ const AccountContainer = ({
label: t('account:logout'),
value: TabEnum.loginout
}
];
]);
const { openConfirm, ConfirmModal } = useConfirm({
content: t('account:confirm_logout')
@@ -129,57 +129,54 @@ const AccountContainer = ({
);
return (
<>
<Script src={getWebReqUrl('/js/qrcode.min.js')} strategy="lazyOnload"></Script>
<PageContainer isLoading={isLoading}>
<Flex flexDirection={['column', 'row']} h={'100%'} pt={[4, 0]}>
{isPc ? (
<Flex
flexDirection={'column'}
p={4}
h={'100%'}
flex={'0 0 200px'}
borderRight={theme.borders.base}
>
<SideTabs<TabEnum>
flex={1}
mx={'auto'}
mt={2}
w={'100%'}
list={tabList}
value={currentTab}
onChange={setCurrentTab}
/>
<Flex alignItems={'center'}>
<Box w={'8px'} h={'8px'} borderRadius={'50%'} bg={'#67c13b'} />
<Box fontSize={'md'} ml={2}>
V{systemVersion}
</Box>
</Flex>
<PageContainer isLoading={isLoading}>
<Flex flexDirection={['column', 'row']} h={'100%'} pt={[4, 0]}>
{isPc ? (
<Flex
flexDirection={'column'}
p={4}
h={'100%'}
flex={'0 0 200px'}
borderRight={theme.borders.base}
>
<SideTabs<TabEnum>
flex={1}
mx={'auto'}
mt={2}
w={'100%'}
list={tabList.current}
value={currentTab}
onChange={setCurrentTab}
/>
<Flex alignItems={'center'}>
<Box w={'8px'} h={'8px'} borderRadius={'50%'} bg={'#67c13b'} />
<Box fontSize={'md'} ml={2}>
V{systemVersion}
</Box>
</Flex>
) : (
<Box mb={3}>
<LightRowTabs<TabEnum>
m={'auto'}
w={'100%'}
size={isPc ? 'md' : 'sm'}
list={tabList.map((item) => ({
value: item.value,
label: item.label
}))}
value={currentTab}
onChange={setCurrentTab}
/>
</Box>
)}
<Box flex={'1 0 0'} h={'100%'} pb={[4, 0]} overflow={'auto'}>
{children}
</Flex>
) : (
<Box mb={3}>
<LightRowTabs<TabEnum>
m={'auto'}
w={'100%'}
size={isPc ? 'md' : 'sm'}
list={tabList.current.map((item) => ({
value: item.value,
label: item.label
}))}
value={currentTab}
onChange={setCurrentTab}
/>
</Box>
</Flex>
<ConfirmModal />
</PageContainer>
</>
)}
<Box flex={'1 0 0'} h={'100%'} pb={[4, 0]} overflow={'auto'}>
{children}
</Box>
</Flex>
<ConfirmModal />
</PageContainer>
);
};

View File

@@ -10,7 +10,7 @@ import { UserUpdateParams } from '@/types/user';
import TimezoneSelect from '@fastgpt/web/components/common/MySelect/TimezoneSelect';
import I18nLngSelector from '@/components/Select/I18nLngSelector';
import AccountContainer from './components/AccountContainer';
import { serviceSideProps } from '@/web/common/utils/i18n';
import { serviceSideProps } from '@fastgpt/web/common/system/nextjs';
const Individuation = () => {
const { t } = useTranslation();

View File

@@ -1,14 +1,5 @@
import React, { useCallback } from 'react';
import {
ModalBody,
Box,
Flex,
Input,
ModalFooter,
Button,
HStack,
useDisclosure
} from '@chakra-ui/react';
import React from 'react';
import { ModalBody, Box, Flex, Input, ModalFooter, Button, HStack } from '@chakra-ui/react';
import MyModal from '@fastgpt/web/components/common/MyModal';
import { useTranslation } from 'next-i18next';
import { useForm } from 'react-hook-form';
@@ -89,7 +80,7 @@ const UpdateNotificationModal = ({ onClose }: { onClose: () => void }) => {
></Input>
</Flex>
<Flex mt="6" alignItems="center" position={'relative'}>
<Box flex={'0 0 70px'}>{t('account_info:verification_code_required')}</Box>
<Box flex={'0 0 70px'}>{t('account_info:verification_code')}</Box>
<Input
flex={1}
bg={'myGray.50'}

View File

@@ -44,7 +44,7 @@ import { useSystem } from '@fastgpt/web/hooks/useSystem';
import MyImage from '@fastgpt/web/components/common/Image/MyImage';
import { getWebReqUrl } from '@fastgpt/web/common/system/utils';
import AccountContainer from '../components/AccountContainer';
import { serviceSideProps } from '@/web/common/utils/i18n';
import { serviceSideProps } from '@fastgpt/web/common/system/nextjs';
import { useRouter } from 'next/router';
import TeamSelector from '../components/TeamSelector';

View File

@@ -8,7 +8,7 @@ import { useLoading } from '@fastgpt/web/hooks/useLoading';
import { useTranslation } from 'next-i18next';
import EmptyTip from '@fastgpt/web/components/common/EmptyTip';
import AccountContainer, { TabEnum } from './components/AccountContainer';
import { serviceSideProps } from '@/web/common/utils/i18n';
import { serviceSideProps } from '@fastgpt/web/common/system/nextjs';
const InformTable = () => {
const { t } = useTranslation();

View File

@@ -26,7 +26,7 @@ import { useLoading } from '@fastgpt/web/hooks/useLoading';
import QuestionTip from '@fastgpt/web/components/common/MyTooltip/QuestionTip';
import EmptyTip from '@fastgpt/web/components/common/EmptyTip';
import AccountContainer, { TabEnum } from './components/AccountContainer';
import { serviceSideProps } from '@/web/common/utils/i18n';
import { serviceSideProps } from '@fastgpt/web/common/system/nextjs';
const Promotion = () => {
const { t } = useTranslation();

View File

@@ -1,4 +1,4 @@
import { serviceSideProps } from '@/web/common/utils/i18n';
import { serviceSideProps } from '@fastgpt/web/common/system/nextjs';
import AccountContainer from '../components/AccountContainer';
import { Box, Button, Flex, useDisclosure } from '@chakra-ui/react';
import Icon from '@fastgpt/web/components/common/Icon';

View File

@@ -31,7 +31,7 @@ import { formatNumber } from '@fastgpt/global/common/math/tools';
import EmptyTip from '@fastgpt/web/components/common/EmptyTip';
import { useSystem } from '@fastgpt/web/hooks/useSystem';
import AccountContainer, { TabEnum } from '../components/AccountContainer';
import { serviceSideProps } from '@/web/common/utils/i18n';
import { serviceSideProps } from '@fastgpt/web/common/system/nextjs';
const UsageDetail = dynamic(() => import('./UsageDetail'));

View File

@@ -19,7 +19,7 @@ import { formatTime2YMDHMS } from '@fastgpt/global/common/string/time';
import { useSystemStore } from '@/web/common/system/useSystemStore';
import { useDatasetStore } from '@/web/core/dataset/store/dataset';
import SaveButton from '../Workflow/components/SaveButton';
import { useBoolean, useDebounceEffect } from 'ahooks';
import { useBoolean, useDebounceEffect, useLockFn } from 'ahooks';
import { appWorkflow2Form } from '@fastgpt/global/core/app/utils';
import {
compareSimpleAppSnapshot,
@@ -29,6 +29,7 @@ import {
import PublishHistories from '../PublishHistoriesSlider';
import { AppVersionSchemaType } from '@fastgpt/global/core/app/version';
import { useBeforeunload } from '@fastgpt/web/hooks/useBeforeunload';
import { isProduction } from '@fastgpt/global/common/system/constants';
const Header = ({
forbiddenSaveSnapshot,
@@ -152,15 +153,22 @@ const Header = ({
{ wait: 500 }
);
const onLeaveAutoSave = useCallback(() => {
const onLeaveAutoSave = useLockFn(async () => {
if (isSaved) return;
try {
console.log('Leave auto save');
onClickSave({ isPublish: false, versionName: t('app:auto_save') });
return onClickSave({ isPublish: false, versionName: t('app:auto_save') });
} catch (error) {
console.error(error);
}
}, [isSaved, onClickSave, t]);
});
useEffect(() => {
return () => {
if (isProduction) {
onLeaveAutoSave();
}
};
}, []);
useBeforeunload({
tip: t('common:core.common.tip.leave page'),
callback: onLeaveAutoSave

View File

@@ -2,7 +2,7 @@ import React, { useEffect } from 'react';
import { Box } from '@chakra-ui/react';
import dynamic from 'next/dynamic';
import Loading from '@fastgpt/web/components/common/MyLoading';
import { serviceSideProps } from '@/web/common/utils/i18n';
import { serviceSideProps } from '@fastgpt/web/common/system/nextjs';
import NextHead from '@/components/common/NextHead';
import { useContextSelector } from 'use-context-selector';
import AppContextProvider, { AppContext } from './components/context';

View File

@@ -1,7 +1,7 @@
import React, { useMemo, useState } from 'react';
import { Box, Flex, Button, useDisclosure, Input, InputGroup } from '@chakra-ui/react';
import { AddIcon } from '@chakra-ui/icons';
import { serviceSideProps } from '@/web/common/utils/i18n';
import { serviceSideProps } from '@fastgpt/web/common/system/nextjs';
import { useUserStore } from '@/web/support/user/useUserStore';
import { useTranslation } from 'next-i18next';
import dynamic from 'next/dynamic';

View File

@@ -15,7 +15,7 @@ import ChatHistorySlider from './components/ChatHistorySlider';
import SliderApps from './components/SliderApps';
import ChatHeader from './components/ChatHeader';
import { useUserStore } from '@/web/support/user/useUserStore';
import { serviceSideProps } from '@/web/common/utils/i18n';
import { serviceSideProps } from '@fastgpt/web/common/system/nextjs';
import { getChatTitleFromChatMessage } from '@fastgpt/global/core/chat/utils';
import { GPTMessages2Chats } from '@fastgpt/global/core/chat/adapt';
import { getMyApps } from '@/web/core/app/api';

View File

@@ -11,7 +11,7 @@ import type { StartChatFnProps } from '@/components/core/chat/ChatContainer/type
import PageContainer from '@/components/PageContainer';
import ChatHeader from './components/ChatHeader';
import ChatHistorySlider from './components/ChatHistorySlider';
import { serviceSideProps } from '@/web/common/utils/i18n';
import { serviceSideProps } from '@fastgpt/web/common/system/nextjs';
import { useTranslation } from 'next-i18next';
import { getInitOutLinkChatInfo } from '@/web/core/chat/api';
import { getChatTitleFromChatMessage } from '@fastgpt/global/core/chat/utils';

View File

@@ -8,7 +8,7 @@ import PageContainer from '@/components/PageContainer';
import { getMyTokensApps } from '@/web/core/chat/api';
import ChatHistorySlider from './components/ChatHistorySlider';
import ChatHeader from './components/ChatHeader';
import { serviceSideProps } from '@/web/common/utils/i18n';
import { serviceSideProps } from '@fastgpt/web/common/system/nextjs';
import { useTranslation } from 'next-i18next';
import ChatBox from '@/components/core/chat/ChatContainer/ChatBox';
import type { StartChatFnProps } from '@/components/core/chat/ChatContainer/type';

View File

@@ -5,7 +5,7 @@ import { useToast } from '@fastgpt/web/hooks/useToast';
import { getErrText } from '@fastgpt/global/common/error/utils';
import dynamic from 'next/dynamic';
import PageContainer from '@/components/PageContainer';
import { serviceSideProps } from '@/web/common/utils/i18n';
import { serviceSideProps } from '@fastgpt/web/common/system/nextjs';
import { useTranslation } from 'next-i18next';
import MetaDataCard from './components/MetaDataCard';
import NavBar from './components/NavBar';

View File

@@ -2,7 +2,7 @@ import React, { useCallback, useMemo, useState } from 'react';
import { Box, Flex, Button, InputGroup, InputLeftElement, Input } from '@chakra-ui/react';
import { useRouter } from 'next/router';
import { useTranslation } from 'next-i18next';
import { serviceSideProps } from '@/web/common/utils/i18n';
import { serviceSideProps } from '@fastgpt/web/common/system/nextjs';
import ParentPaths from '@/components/common/folder/Path';
import List from './component/List';
import { DatasetsContext } from './context';

View File

@@ -1,4 +1,4 @@
import { serviceSideProps } from '@/web/common/utils/i18n';
import { serviceSideProps } from '@fastgpt/web/common/system/nextjs';
import React, { useEffect } from 'react';
import Loading from '@fastgpt/web/components/common/MyLoading';
import { useRouter } from 'next/router';

View File

@@ -32,8 +32,10 @@ const WechatForm = ({ setPageType, loginSuccess }: Props) => {
useQuery(['getWXLoginResult', wechatInfo?.code], () => getWXLoginResult(wechatInfo?.code || ''), {
refetchInterval: 3 * 1000,
enabled: !!wechatInfo?.code,
onSuccess(data: ResLogin) {
loginSuccess(data);
onSuccess(data: ResLogin | undefined) {
if (data) {
loginSuccess(data);
}
}
});

View File

@@ -6,7 +6,7 @@ import { clearToken, setToken } from '@/web/support/user/auth';
import { postFastLogin } from '@/web/support/user/api';
import { useToast } from '@fastgpt/web/hooks/useToast';
import Loading from '@fastgpt/web/components/common/MyLoading';
import { serviceSideProps } from '@/web/common/utils/i18n';
import { serviceSideProps } from '@fastgpt/web/common/system/nextjs';
import { getErrText } from '@fastgpt/global/common/error/utils';
import { useTranslation } from 'next-i18next';
const FastLogin = ({

View File

@@ -18,7 +18,7 @@ import { useUserStore } from '@/web/support/user/useUserStore';
import { useChatStore } from '@/web/core/chat/context/useChatStore';
import LoginForm from './components/LoginForm/LoginForm';
import dynamic from 'next/dynamic';
import { serviceSideProps } from '@/web/common/utils/i18n';
import { serviceSideProps } from '@fastgpt/web/common/system/nextjs';
import { clearToken, setToken } from '@/web/support/user/auth';
import Script from 'next/script';
import Loading from '@fastgpt/web/components/common/MyLoading';

View File

@@ -7,7 +7,7 @@ import { clearToken, setToken } from '@/web/support/user/auth';
import { oauthLogin } from '@/web/support/user/api';
import { useToast } from '@fastgpt/web/hooks/useToast';
import Loading from '@fastgpt/web/components/common/MyLoading';
import { serviceSideProps } from '@/web/common/utils/i18n';
import { serviceSideProps } from '@fastgpt/web/common/system/nextjs';
import { getErrText } from '@fastgpt/global/common/error/utils';
import { useTranslation } from 'next-i18next';
import { OAuthEnum } from '@fastgpt/global/support/user/constant';

View File

@@ -4,7 +4,7 @@ import { ChevronRightIcon } from '@chakra-ui/icons';
import MyIcon from '@fastgpt/web/components/common/Icon';
import { useRouter } from 'next/router';
import { useSystemStore } from '@/web/common/system/useSystemStore';
import { serviceSideProps } from '@/web/common/utils/i18n';
import { serviceSideProps } from '@fastgpt/web/common/system/nextjs';
import { useTranslation } from 'next-i18next';
import { getDocPath } from '@/web/common/system/doc';

View File

@@ -1,5 +1,5 @@
import React from 'react';
import { serviceSideProps } from '@/web/common/utils/i18n';
import { serviceSideProps } from '@fastgpt/web/common/system/nextjs';
import { Box, Flex } from '@chakra-ui/react';
import { useUserStore } from '@/web/support/user/useUserStore';
import { getTeamPlanStatus } from '@/web/support/user/team/api';

View File

@@ -1,4 +1,4 @@
import { serviceSideProps } from '@/web/common/utils/i18n';
import { serviceSideProps } from '@fastgpt/web/common/system/nextjs';
import { getPluginGroups, getSystemPlugTemplates } from '@/web/core/app/api/plugin';
import { Box, Flex, Grid, useDisclosure } from '@chakra-ui/react';
import Avatar from '@fastgpt/web/components/common/Avatar';

View File

@@ -5,7 +5,8 @@ import type { FastGPTConfigFileType } from '@fastgpt/global/common/system/types/
import { PluginSourceEnum } from '@fastgpt/global/core/plugin/constants';
import { getFastGPTConfigFromDB } from '@fastgpt/service/common/system/config/controller';
import { PluginTemplateType } from '@fastgpt/global/core/plugin/type';
import { FastGPTProUrl, isProduction } from '@fastgpt/service/common/system/constants';
import { FastGPTProUrl } from '@fastgpt/service/common/system/constants';
import { isProduction } from '@fastgpt/global/common/system/constants';
import { initFastGPTConfig } from '@fastgpt/service/common/system/tools';
import json5 from 'json5';
import { SystemPluginTemplateItemType } from '@fastgpt/global/core/workflow/type';

View File

@@ -1,4 +1,5 @@
import { FastGPTProUrl, isProduction } from '@fastgpt/service/common/system/constants';
import { FastGPTProUrl } from '@fastgpt/service/common/system/constants';
import { isProduction } from '@fastgpt/global/common/system/constants';
import { cloneDeep } from 'lodash';
import { getCommunityCb, getCommunityPlugins } from '@fastgpt/plugins/register';
import { GET, POST } from '@fastgpt/service/common/api/plusRequest';

View File

@@ -1,4 +1,4 @@
import { isProduction } from '@fastgpt/service/common/system/constants';
import { isProduction } from '@fastgpt/global/common/system/constants';
import { readdirSync, readFileSync } from 'fs';
import path from 'path';

View File

@@ -2,7 +2,7 @@ import { useTranslation } from 'next-i18next';
import { useToast } from '@fastgpt/web/hooks/useToast';
import { useCallback } from 'react';
import { hasHttps } from '@fastgpt/web/common/system/utils';
import { isProduction } from '@fastgpt/service/common/system/constants';
import { isProduction } from '@fastgpt/global/common/system/constants';
/**
* copy text data

View File

@@ -20,10 +20,3 @@ export const langMap = {
avatar: 'common/language/China'
}
};
export const serviceSideProps = (content: any, ns: I18nNsType = []) => {
const lang = content.req?.cookies?.NEXT_LOCALE || content.locale;
const extraLng = content.req?.cookies?.NEXT_LOCALE ? undefined : content.locales;
return serverSideTranslations(lang, ['common', ...ns], null, extraLng);
};