diff --git a/packages/global/common/error/code/system.ts b/packages/global/common/error/code/system.ts index 37dcad0a6..efe177c60 100644 --- a/packages/global/common/error/code/system.ts +++ b/packages/global/common/error/code/system.ts @@ -2,13 +2,28 @@ import { type ErrType } from '../errorCode'; import { i18nT } from '../../../../web/i18n/utils'; /* dataset: 509000 */ export enum SystemErrEnum { - communityVersionNumLimit = 'communityVersionNumLimit' + communityVersionNumLimit = 'communityVersionNumLimit', + licenseAppAmountLimit = 'licenseAppAmountLimit', + licenseDatasetAmountLimit = 'licenseDatasetAmountLimit', + licenseUserAmountLimit = 'licenseUserAmountLimit' } const systemErr = [ { statusText: SystemErrEnum.communityVersionNumLimit, message: i18nT('common:code_error.system_error.community_version_num_limit') + }, + { + statusText: SystemErrEnum.licenseAppAmountLimit, + message: i18nT('common:code_error.system_error.license_app_amount_limit') + }, + { + statusText: SystemErrEnum.licenseDatasetAmountLimit, + message: i18nT('common:code_error.system_error.license_dataset_amount_limit') + }, + { + statusText: SystemErrEnum.licenseUserAmountLimit, + message: i18nT('common:code_error.system_error.license_user_amount_limit') } ]; diff --git a/packages/global/common/system/types/index.d.ts b/packages/global/common/system/types/index.d.ts index 23b53e2c8..f3b6d33a6 100644 --- a/packages/global/common/system/types/index.d.ts +++ b/packages/global/common/system/types/index.d.ts @@ -70,6 +70,9 @@ export type FastGPTFeConfigsType = { show_publish_dingtalk?: boolean; show_publish_offiaccount?: boolean; + show_dataset_enhance?: boolean; + show_batch_eval?: boolean; + concatMd?: string; docUrl?: string; openAPIDocUrl?: string; @@ -142,3 +145,21 @@ export type customPdfParseType = { doc2xKey?: string; price?: number; }; + +export type LicenseDataType = { + startTime: string; + expiredTime: string; + company: string; + description?: string; // 描述 + hosts?: string[]; // 管理端有效域名 + maxUsers?: number; // 最大用户数,不填默认不上限 + maxApps?: number; // 最大应用数,不填默认不上限 + maxDatasets?: number; // 最大数据集数,不填默认不上限 + functions: { + sso: boolean; + pay: boolean; + customTemplates: boolean; + datasetEnhance: boolean; + batchEval: boolean; + }; +}; diff --git a/packages/service/common/system/config/controller.ts b/packages/service/common/system/config/controller.ts index 8cb576060..420f53db6 100644 --- a/packages/service/common/system/config/controller.ts +++ b/packages/service/common/system/config/controller.ts @@ -2,26 +2,44 @@ import { SystemConfigsTypeEnum } from '@fastgpt/global/common/system/config/cons import { MongoSystemConfigs } from './schema'; import { type FastGPTConfigFileType } from '@fastgpt/global/common/system/types'; import { FastGPTProUrl } from '../constants'; +import { type LicenseDataType } from '@fastgpt/global/common/system/types'; -export const getFastGPTConfigFromDB = async () => { +export const getFastGPTConfigFromDB = async (): Promise<{ + fastgptConfig: FastGPTConfigFileType; + licenseData?: LicenseDataType; +}> => { if (!FastGPTProUrl) { return { - config: {} as FastGPTConfigFileType + fastgptConfig: {} as FastGPTConfigFileType }; } - const res = await MongoSystemConfigs.findOne({ - type: SystemConfigsTypeEnum.fastgpt - }).sort({ - createTime: -1 - }); + const [fastgptConfig, licenseConfig] = await Promise.all([ + MongoSystemConfigs.findOne({ + type: SystemConfigsTypeEnum.fastgpt + }).sort({ + createTime: -1 + }), + MongoSystemConfigs.findOne({ + type: SystemConfigsTypeEnum.license + }).sort({ + createTime: -1 + }) + ]); - const config = res?.value || {}; + const config = fastgptConfig?.value || {}; + const licenseData = licenseConfig?.value?.data as LicenseDataType | undefined; + + const fastgptConfigTime = fastgptConfig?.createTime.getTime().toString(); + const licenseConfigTime = licenseConfig?.createTime.getTime().toString(); // 利用配置文件的创建时间(更新时间)来做缓存,如果前端命中缓存,则不需要再返回配置文件 - global.systemInitBufferId = res ? res.createTime.getTime().toString() : undefined; + global.systemInitBufferId = fastgptConfigTime + ? `${fastgptConfigTime}-${licenseConfigTime}` + : undefined; return { - config: config as FastGPTConfigFileType + fastgptConfig: config as FastGPTConfigFileType, + licenseData }; }; diff --git a/packages/service/core/app/schema.ts b/packages/service/core/app/schema.ts index ce042a500..3844a07f2 100644 --- a/packages/service/core/app/schema.ts +++ b/packages/service/core/app/schema.ts @@ -119,6 +119,7 @@ const AppSchema = new Schema({ defaultPermission: Number }); +AppSchema.index({ type: 1 }); AppSchema.index({ teamId: 1, updateTime: -1 }); AppSchema.index({ teamId: 1, type: 1 }); AppSchema.index( diff --git a/packages/service/core/dataset/schema.ts b/packages/service/core/dataset/schema.ts index a375b284e..e75b5c0ca 100644 --- a/packages/service/core/dataset/schema.ts +++ b/packages/service/core/dataset/schema.ts @@ -123,6 +123,7 @@ const DatasetSchema = new Schema({ try { DatasetSchema.index({ teamId: 1 }); + DatasetSchema.index({ type: 1 }); } catch (error) { console.log(error); } diff --git a/packages/service/support/permission/teamLimit.ts b/packages/service/support/permission/teamLimit.ts index 3345ac739..a897428d5 100644 --- a/packages/service/support/permission/teamLimit.ts +++ b/packages/service/support/permission/teamLimit.ts @@ -54,23 +54,50 @@ export const checkTeamDatasetLimit = async (teamId: string) => { }) ]); + // User check if (standardConstants && datasetCount >= standardConstants.maxDatasetAmount) { return Promise.reject(TeamErrEnum.datasetAmountNotEnough); } + + // System check + if (global?.licenseData?.maxDatasets && typeof global?.licenseData?.maxDatasets === 'number') { + const totalDatasets = await MongoDataset.countDocuments({ + type: { $ne: DatasetTypeEnum.folder } + }); + if (totalDatasets >= global.licenseData.maxDatasets) { + return Promise.reject(SystemErrEnum.licenseDatasetAmountLimit); + } + } + // Open source check if (!global.feConfigs.isPlus && datasetCount >= 30) { return Promise.reject(SystemErrEnum.communityVersionNumLimit); } }; + export const checkTeamAppLimit = async (teamId: string, amount = 1) => { const [{ standardConstants }, appCount] = await Promise.all([ getTeamStandPlan({ teamId }), MongoApp.countDocuments({ teamId, - type: { $in: [AppTypeEnum.simple, AppTypeEnum.workflow, AppTypeEnum.plugin] } + type: { + $in: [AppTypeEnum.simple, AppTypeEnum.workflow, AppTypeEnum.plugin, AppTypeEnum.tool] + } }) ]); if (standardConstants && appCount + amount >= standardConstants.maxAppAmount) { return Promise.reject(TeamErrEnum.appAmountNotEnough); } + + // System check + if (global?.licenseData?.maxApps && typeof global?.licenseData?.maxApps === 'number') { + const totalApps = await MongoApp.countDocuments({ + type: { + $in: [AppTypeEnum.simple, AppTypeEnum.workflow, AppTypeEnum.plugin, AppTypeEnum.tool] + } + }); + if (totalApps >= global.licenseData.maxApps) { + return Promise.reject(SystemErrEnum.licenseAppAmountLimit); + } + } }; diff --git a/packages/service/type.d.ts b/packages/service/type.d.ts index 73ce9060d..213e14d8f 100644 --- a/packages/service/type.d.ts +++ b/packages/service/type.d.ts @@ -1,4 +1,8 @@ -import type { FastGPTFeConfigsType, SystemEnvType } from '@fastgpt/global/common/system/types'; +import type { + FastGPTFeConfigsType, + LicenseDataType, + SystemEnvType +} from '@fastgpt/global/common/system/types'; import { TTSModelType, RerankModelItemType, @@ -17,6 +21,7 @@ declare global { var feConfigs: FastGPTFeConfigsType; var systemEnv: SystemEnvType; var subPlans: SubPlanType | undefined; + var licenseData: LicenseDataType | undefined; var workerPoll: Record; } diff --git a/packages/web/i18n/en/common.json b/packages/web/i18n/en/common.json index 656226802..b356bf847 100644 --- a/packages/web/i18n/en/common.json +++ b/packages/web/i18n/en/common.json @@ -148,6 +148,9 @@ "code_error.plugin_error.not_exist": "Plugin Does Not Exist", "code_error.plugin_error.un_auth": "Unauthorized to Operate This Plugin", "code_error.system_error.community_version_num_limit": "Exceeded Open Source Version Limit, Please Upgrade to Commercial Version: https://tryfastgpt.ai", + "code_error.system_error.license_app_amount_limit": "Exceed the maximum number of applications in the system", + "code_error.system_error.license_dataset_amount_limit": "Exceed the maximum number of knowledge bases in the system", + "code_error.system_error.license_user_amount_limit": "Exceed the maximum number of users in the system", "code_error.team_error.ai_points_not_enough": "Insufficient AI Points", "code_error.team_error.app_amount_not_enough": "Application Limit Reached", "code_error.team_error.cannot_delete_default_group": "Cannot delete default group", diff --git a/packages/web/i18n/zh-CN/common.json b/packages/web/i18n/zh-CN/common.json index b08701db9..c26c029f4 100644 --- a/packages/web/i18n/zh-CN/common.json +++ b/packages/web/i18n/zh-CN/common.json @@ -148,6 +148,9 @@ "code_error.plugin_error.not_exist": "插件不存在", "code_error.plugin_error.un_auth": "无权操作该插件", "code_error.system_error.community_version_num_limit": "超出开源版数量限制,请升级商业版: https://fastgpt.in", + "code_error.system_error.license_app_amount_limit": "超出系统最大应用数量", + "code_error.system_error.license_dataset_amount_limit": "超出系统最大知识库数量", + "code_error.system_error.license_user_amount_limit": "超出系统最大用户数量", "code_error.team_error.ai_points_not_enough": "AI 积分不足", "code_error.team_error.app_amount_not_enough": "应用数量已达上限~", "code_error.team_error.cannot_delete_default_group": "不能删除默认群组", diff --git a/packages/web/i18n/zh-Hant/common.json b/packages/web/i18n/zh-Hant/common.json index 8e8990eeb..6b482499a 100644 --- a/packages/web/i18n/zh-Hant/common.json +++ b/packages/web/i18n/zh-Hant/common.json @@ -147,6 +147,9 @@ "code_error.plugin_error.not_exist": "外掛程式不存在", "code_error.plugin_error.un_auth": "無權操作此外掛程式", "code_error.system_error.community_version_num_limit": "超出開源版數量限制,請升級商業版:https://tryfastgpt.ai", + "code_error.system_error.license_app_amount_limit": "超出系統最大應用數量", + "code_error.system_error.license_dataset_amount_limit": "超出系統最大知識庫數量", + "code_error.system_error.license_user_amount_limit": "超出系統最大用戶數量", "code_error.team_error.ai_points_not_enough": "AI 點數不足", "code_error.team_error.app_amount_not_enough": "已達應用程式數量上限", "code_error.team_error.cannot_delete_default_group": "無法刪除預設群組", diff --git a/projects/app/src/instrumentation.ts b/projects/app/src/instrumentation.ts index 54baf0c40..58c1a4ff0 100644 --- a/projects/app/src/instrumentation.ts +++ b/projects/app/src/instrumentation.ts @@ -17,7 +17,9 @@ export async function register() { { getSystemPluginCb }, { startMongoWatch }, { startCron }, - { startTrainingQueue } + { startTrainingQueue }, + { preLoadWorker }, + { loadSystemModels } ] = await Promise.all([ import('@fastgpt/service/common/mongo/init'), import('@fastgpt/service/common/mongo/index'), @@ -28,7 +30,9 @@ export async function register() { import('@/service/core/app/plugin'), import('@/service/common/system/volumnMongoWatch'), import('@/service/common/system/cron'), - import('@/service/core/dataset/training/utils') + import('@/service/core/dataset/training/utils'), + import('@fastgpt/service/worker/preload'), + import('@fastgpt/service/core/ai/config/utils') ]); // 执行初始化流程 @@ -40,8 +44,9 @@ export async function register() { connectMongo(connectionLogMongo, MONGO_LOG_URL); //init system config;init vector database;init root user - await Promise.all([getInitConfig(), initVectorStore(), initRootUser()]); + await Promise.all([getInitConfig(), initVectorStore(), initRootUser(), loadSystemModels()]); + // 异步加载 initSystemPluginGroups(); initAppTemplateTypes(); getSystemPluginCb(); @@ -49,6 +54,12 @@ export async function register() { startCron(); startTrainingQueue(true); + try { + await preLoadWorker(); + } catch (error) { + console.error('Preload worker error', error); + } + console.log('Init system success'); } } catch (error) { diff --git a/projects/app/src/pageComponents/dataset/detail/Form/CollectionChunkForm.tsx b/projects/app/src/pageComponents/dataset/detail/Form/CollectionChunkForm.tsx index cb079a178..20a29607d 100644 --- a/projects/app/src/pageComponents/dataset/detail/Form/CollectionChunkForm.tsx +++ b/projects/app/src/pageComponents/dataset/detail/Form/CollectionChunkForm.tsx @@ -218,47 +218,48 @@ const CollectionChunkForm = ({ form }: { form: UseFormReturn - {trainingType === DatasetCollectionDataProcessModeEnum.chunk && ( - - - {t('dataset:enhanced_indexes')} + {trainingType === DatasetCollectionDataProcessModeEnum.chunk && + feConfigs?.show_dataset_enhance !== false && ( + + + {t('dataset:enhanced_indexes')} + + + + + + {t('dataset:auto_indexes')} + + + + + + + + {t('dataset:image_auto_parse')} + + + + + - - - - - {t('dataset:auto_indexes')} - - - - - - - - {t('dataset:image_auto_parse')} - - - - - - - )} + )} {t('dataset:params_setting')} diff --git a/projects/app/src/pages/account/apikey.tsx b/projects/app/src/pages/account/apikey.tsx index 0ef824a3a..d86ac0680 100644 --- a/projects/app/src/pages/account/apikey.tsx +++ b/projects/app/src/pages/account/apikey.tsx @@ -1,3 +1,4 @@ +'use client'; import React from 'react'; import ApiKeyTable from '@/components/support/apikey/Table'; import { useTranslation } from 'next-i18next'; diff --git a/projects/app/src/pages/account/bill/index.tsx b/projects/app/src/pages/account/bill/index.tsx index f848a09c1..d2daff59d 100644 --- a/projects/app/src/pages/account/bill/index.tsx +++ b/projects/app/src/pages/account/bill/index.tsx @@ -1,3 +1,4 @@ +'use client'; import { Box, Button, Flex } from '@chakra-ui/react'; import FillRowTabs from '@fastgpt/web/components/common/Tabs/FillRowTabs'; import dynamic from 'next/dynamic'; diff --git a/projects/app/src/pages/account/info/index.tsx b/projects/app/src/pages/account/info/index.tsx index 67958539e..440baec28 100644 --- a/projects/app/src/pages/account/info/index.tsx +++ b/projects/app/src/pages/account/info/index.tsx @@ -1,3 +1,4 @@ +'use client'; import React, { useCallback, useEffect, useMemo } from 'react'; import { Box, diff --git a/projects/app/src/pages/account/inform.tsx b/projects/app/src/pages/account/inform.tsx index fd1c7ccde..5127db9cc 100644 --- a/projects/app/src/pages/account/inform.tsx +++ b/projects/app/src/pages/account/inform.tsx @@ -1,3 +1,4 @@ +'use client'; import React, { useState } from 'react'; import { Box, Flex, useTheme } from '@chakra-ui/react'; import { getInforms, readInform } from '@/web/support/user/inform/api'; diff --git a/projects/app/src/pages/account/model/index.tsx b/projects/app/src/pages/account/model/index.tsx index 877088b34..5f14b0413 100644 --- a/projects/app/src/pages/account/model/index.tsx +++ b/projects/app/src/pages/account/model/index.tsx @@ -1,3 +1,4 @@ +'use client'; import { serviceSideProps } from '@/web/common/i18n/utils'; import React, { useMemo, useState } from 'react'; import AccountContainer from '@/pageComponents/account/AccountContainer'; diff --git a/projects/app/src/pages/account/promotion.tsx b/projects/app/src/pages/account/promotion.tsx index 67f7e0a85..b1d76cbbf 100644 --- a/projects/app/src/pages/account/promotion.tsx +++ b/projects/app/src/pages/account/promotion.tsx @@ -1,3 +1,4 @@ +'use client'; import React from 'react'; import { Grid, diff --git a/projects/app/src/pages/account/setting.tsx b/projects/app/src/pages/account/setting.tsx index 18c2e44ac..0547133ba 100644 --- a/projects/app/src/pages/account/setting.tsx +++ b/projects/app/src/pages/account/setting.tsx @@ -1,3 +1,4 @@ +'use client'; import { Box, Card, Flex } from '@chakra-ui/react'; import React, { useCallback } from 'react'; import MyIcon from '@fastgpt/web/components/common/Icon'; diff --git a/projects/app/src/pages/account/team/index.tsx b/projects/app/src/pages/account/team/index.tsx index 3b4876611..1eb470f46 100644 --- a/projects/app/src/pages/account/team/index.tsx +++ b/projects/app/src/pages/account/team/index.tsx @@ -1,3 +1,4 @@ +'use client'; import { serviceSideProps } from '@/web/common/i18n/utils'; import AccountContainer from '@/pageComponents/account/AccountContainer'; import { Box, Flex } from '@chakra-ui/react'; diff --git a/projects/app/src/pages/account/usage/index.tsx b/projects/app/src/pages/account/usage/index.tsx index 4e4b09b24..ba9800ce1 100644 --- a/projects/app/src/pages/account/usage/index.tsx +++ b/projects/app/src/pages/account/usage/index.tsx @@ -1,3 +1,4 @@ +'use client'; import React, { useEffect, useMemo, useState } from 'react'; import { Flex, Box, HStack } from '@chakra-ui/react'; import { UsageSourceEnum, UsageSourceMap } from '@fastgpt/global/support/wallet/usage/constants'; diff --git a/projects/app/src/pages/api/admin/initv4820.ts b/projects/app/src/pages/api/admin/initv4820.ts index dde5ab141..333f3e6d2 100644 --- a/projects/app/src/pages/api/admin/initv4820.ts +++ b/projects/app/src/pages/api/admin/initv4820.ts @@ -21,7 +21,7 @@ async function handler(req: NextApiRequest, res: NextApiResponse) { await authCert({ req, authRoot: true }); // load config - const [{ config: dbConfig }, fileConfig] = await Promise.all([ + const [{ fastgptConfig: dbConfig }, fileConfig] = await Promise.all([ getFastGPTConfigFromDB(), readConfigData('config.json') ]); diff --git a/projects/app/src/pages/api/core/app/httpPlugin/create.ts b/projects/app/src/pages/api/core/app/httpPlugin/create.ts index 9cea759c0..6936a4cf9 100644 --- a/projects/app/src/pages/api/core/app/httpPlugin/create.ts +++ b/projects/app/src/pages/api/core/app/httpPlugin/create.ts @@ -11,6 +11,7 @@ import { AppTypeEnum } from '@fastgpt/global/core/app/constants'; import { pushTrack } from '@fastgpt/service/common/middle/tracks/utils'; import { authApp } from '@fastgpt/service/support/permission/app/auth'; import { TeamAppCreatePermissionVal } from '@fastgpt/global/support/permission/user/constant'; +import { checkTeamAppLimit } from '@fastgpt/service/support/permission/teamLimit'; export type createHttpPluginQuery = {}; @@ -35,6 +36,8 @@ async function handler( ? await authApp({ req, appId: parentId, per: TeamAppCreatePermissionVal, authToken: true }) : await authUserPer({ req, authToken: true, per: TeamAppCreatePermissionVal }); + await checkTeamAppLimit(teamId); + const httpPluginId = await mongoSessionRun(async (session) => { // create http plugin folder const httpPluginId = await onCreateApp({ diff --git a/projects/app/src/pages/api/core/app/mcpTools/create.ts b/projects/app/src/pages/api/core/app/mcpTools/create.ts index 78c09bc15..e349d59ed 100644 --- a/projects/app/src/pages/api/core/app/mcpTools/create.ts +++ b/projects/app/src/pages/api/core/app/mcpTools/create.ts @@ -12,6 +12,7 @@ import { getMCPToolSetRuntimeNode } from '@fastgpt/global/core/app/mcpTools/utils'; import { pushTrack } from '@fastgpt/service/common/middle/tracks/utils'; +import { checkTeamAppLimit } from '@fastgpt/service/support/permission/teamLimit'; export type createMCPToolsQuery = {}; @@ -35,6 +36,8 @@ async function handler( ? await authApp({ req, appId: parentId, per: TeamAppCreatePermissionVal, authToken: true }) : await authUserPer({ req, authToken: true, per: TeamAppCreatePermissionVal }); + await checkTeamAppLimit(teamId); + const mcpToolsId = await mongoSessionRun(async (session) => { const mcpToolsId = await onCreateApp({ name, diff --git a/projects/app/src/pages/app/detail/index.tsx b/projects/app/src/pages/app/detail/index.tsx index 554d06b81..56f233cad 100644 --- a/projects/app/src/pages/app/detail/index.tsx +++ b/projects/app/src/pages/app/detail/index.tsx @@ -1,3 +1,4 @@ +'use client'; import React, { useEffect } from 'react'; import { Box } from '@chakra-ui/react'; import dynamic from 'next/dynamic'; diff --git a/projects/app/src/pages/chat/index.tsx b/projects/app/src/pages/chat/index.tsx index b6e1d3ebb..8d184c72d 100644 --- a/projects/app/src/pages/chat/index.tsx +++ b/projects/app/src/pages/chat/index.tsx @@ -1,4 +1,4 @@ -import React, { useCallback, useEffect, useMemo, useState, useRef } from 'react'; +import React, { useCallback, useEffect, useMemo } from 'react'; import NextHead from '@/components/common/NextHead'; import { useRouter } from 'next/router'; import { getInitChatInfo } from '@/web/core/chat/api'; diff --git a/projects/app/src/pages/dashboard/[pluginGroupId]/index.tsx b/projects/app/src/pages/dashboard/[pluginGroupId]/index.tsx index 68f8a3634..f6c2b8b50 100644 --- a/projects/app/src/pages/dashboard/[pluginGroupId]/index.tsx +++ b/projects/app/src/pages/dashboard/[pluginGroupId]/index.tsx @@ -1,3 +1,4 @@ +'use client'; import DashboardContainer from '@/pageComponents/dashboard/Container'; import PluginCard from '@/pageComponents/dashboard/SystemPlugin/ToolCard'; diff --git a/projects/app/src/pages/dashboard/apps/index.tsx b/projects/app/src/pages/dashboard/apps/index.tsx index ef061e2b7..6b85f1031 100644 --- a/projects/app/src/pages/dashboard/apps/index.tsx +++ b/projects/app/src/pages/dashboard/apps/index.tsx @@ -1,4 +1,5 @@ -import React, { useMemo, useState, useEffect } from 'react'; +'use client'; +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/i18n/utils'; diff --git a/projects/app/src/pages/dashboard/mcpServer/index.tsx b/projects/app/src/pages/dashboard/mcpServer/index.tsx index 949016612..eecacdc43 100644 --- a/projects/app/src/pages/dashboard/mcpServer/index.tsx +++ b/projects/app/src/pages/dashboard/mcpServer/index.tsx @@ -1,3 +1,4 @@ +'use client'; import { serviceSideProps } from '@/web/common/i18n/utils'; import React, { useState } from 'react'; import DashboardContainer from '@/pageComponents/dashboard/Container'; diff --git a/projects/app/src/pages/dashboard/templateMarket/index.tsx b/projects/app/src/pages/dashboard/templateMarket/index.tsx index bc9dd1641..bfac0e18e 100644 --- a/projects/app/src/pages/dashboard/templateMarket/index.tsx +++ b/projects/app/src/pages/dashboard/templateMarket/index.tsx @@ -1,3 +1,4 @@ +'use client'; import { serviceSideProps } from '@/web/common/i18n/utils'; import DashboardContainer from '@/pageComponents/dashboard/Container'; import { Box, Button, Flex, Grid, HStack } from '@chakra-ui/react'; diff --git a/projects/app/src/pages/dataset/detail/index.tsx b/projects/app/src/pages/dataset/detail/index.tsx index d855ec6a7..0decfb617 100644 --- a/projects/app/src/pages/dataset/detail/index.tsx +++ b/projects/app/src/pages/dataset/detail/index.tsx @@ -1,3 +1,4 @@ +'use client'; import React from 'react'; import { useRouter } from 'next/router'; import { Box, Flex, type FlexProps } from '@chakra-ui/react'; diff --git a/projects/app/src/pages/dataset/list/index.tsx b/projects/app/src/pages/dataset/list/index.tsx index 51e702a87..6c6f3a7f9 100644 --- a/projects/app/src/pages/dataset/list/index.tsx +++ b/projects/app/src/pages/dataset/list/index.tsx @@ -1,3 +1,4 @@ +'use client'; import React, { useCallback, useMemo, useState } from 'react'; import { Box, Flex, Button, InputGroup, InputLeftElement, Input } from '@chakra-ui/react'; import { useRouter } from 'next/router'; diff --git a/projects/app/src/service/common/system/index.ts b/projects/app/src/service/common/system/index.ts index a4edb596b..9f20ac5c7 100644 --- a/projects/app/src/service/common/system/index.ts +++ b/projects/app/src/service/common/system/index.ts @@ -10,7 +10,6 @@ import json5 from 'json5'; import { defaultGroup, defaultTemplateTypes } from '@fastgpt/web/core/workflow/constants'; import { MongoPluginGroups } from '@fastgpt/service/core/app/plugin/pluginGroupSchema'; import { MongoTemplateTypes } from '@fastgpt/service/core/app/templates/templateTypeSchema'; -import { loadSystemModels } from '@fastgpt/service/core/ai/config/utils'; import { POST } from '@fastgpt/service/common/api/plusRequest'; import { type DeepRagSearchProps, @@ -28,7 +27,6 @@ import { getProApiDatasetFilePreviewUrlRequest } from '@/service/core/dataset/apiDataset/controller'; import { isProVersion } from './constants'; -import { preLoadWorker } from '@fastgpt/service/worker/preload'; export const readConfigData = async (name: string) => { const splitName = name.split('.'); @@ -95,12 +93,25 @@ export function initGlobalVariables() { /* Init system data(Need to connected db). It only needs to run once */ export async function getInitConfig() { - await Promise.all([initSystemConfig(), getSystemVersion(), loadSystemModels()]); - try { - await preLoadWorker(); - } catch (error) { - console.error('Preload worker error', error); - } + const getSystemVersion = async () => { + if (global.systemVersion) return; + try { + if (process.env.NODE_ENV === 'development') { + global.systemVersion = process.env.npm_package_version || '0.0.0'; + } else { + const packageJson = json5.parse(await fs.promises.readFile('/app/package.json', 'utf-8')); + + global.systemVersion = packageJson?.version; + } + console.log(`System Version: ${global.systemVersion}`); + } catch (error) { + console.log(error); + + global.systemVersion = '0.0.0'; + } + }; + + await Promise.all([initSystemConfig(), getSystemVersion()]); } const defaultFeConfigs: FastGPTFeConfigsType = { @@ -125,10 +136,12 @@ const defaultFeConfigs: FastGPTFeConfigsType = { export async function initSystemConfig() { // load config - const [{ config: dbConfig }, fileConfig] = await Promise.all([ + const [{ fastgptConfig, licenseData }, fileConfig] = await Promise.all([ getFastGPTConfigFromDB(), readConfigData('config.json') ]); + global.licenseData = licenseData; + const fileRes = json5.parse(fileConfig) as FastGPTConfigFileType; // get config from database @@ -136,16 +149,18 @@ export async function initSystemConfig() { feConfigs: { ...fileRes?.feConfigs, ...defaultFeConfigs, - ...(dbConfig.feConfigs || {}), - isPlus: !!FastGPTProUrl, + ...(fastgptConfig.feConfigs || {}), + isPlus: !!licenseData, show_aiproxy: !!process.env.AIPROXY_API_ENDPOINT, - show_coupon: process.env.SHOW_COUPON === 'true' + show_coupon: process.env.SHOW_COUPON === 'true', + show_dataset_enhance: licenseData?.functions?.datasetEnhance, + show_batch_eval: licenseData?.functions?.batchEval }, systemEnv: { ...fileRes.systemEnv, - ...(dbConfig.systemEnv || {}) + ...(fastgptConfig.systemEnv || {}) }, - subPlans: dbConfig.subPlans || fileRes.subPlans + subPlans: fastgptConfig.subPlans }; // set config @@ -154,28 +169,11 @@ export async function initSystemConfig() { console.log({ feConfigs: global.feConfigs, systemEnv: global.systemEnv, - subPlans: global.subPlans + subPlans: global.subPlans, + licenseData: global.licenseData }); } -async function getSystemVersion() { - if (global.systemVersion) return; - try { - if (process.env.NODE_ENV === 'development') { - global.systemVersion = process.env.npm_package_version || '0.0.0'; - } else { - const packageJson = json5.parse(await fs.promises.readFile('/app/package.json', 'utf-8')); - - global.systemVersion = packageJson?.version; - } - console.log(`System Version: ${global.systemVersion}`); - } catch (error) { - console.log(error); - - global.systemVersion = '0.0.0'; - } -} - export async function initSystemPluginGroups() { try { const { groupOrder, ...restDefaultGroup } = defaultGroup; diff --git a/projects/app/src/service/common/system/volumnMongoWatch.ts b/projects/app/src/service/common/system/volumnMongoWatch.ts index 0d29a2ef6..85e3a825e 100644 --- a/projects/app/src/service/common/system/volumnMongoWatch.ts +++ b/projects/app/src/service/common/system/volumnMongoWatch.ts @@ -7,6 +7,7 @@ import { debounce } from 'lodash'; import { MongoAppTemplate } from '@fastgpt/service/core/app/templates/templateSchema'; import { getAppTemplatesAndLoadThem } from '@fastgpt/templates/register'; import { watchSystemModelUpdate } from '@fastgpt/service/core/ai/config/utils'; +import { SystemConfigsTypeEnum } from '@fastgpt/global/common/system/config/constants'; export const startMongoWatch = async () => { reloadConfigWatch(); @@ -21,7 +22,11 @@ const reloadConfigWatch = () => { changeStream.on('change', async (change) => { try { - if (change.operationType === 'insert') { + if ( + (change.operationType === 'insert' && + change.fullDocument.type === SystemConfigsTypeEnum.fastgptPro) || + change.operationType === 'update' + ) { await initSystemConfig(); console.log('refresh system config'); }