New license (#4809)

* feat: new-license

* perf: volumn watch

* Set use client
This commit is contained in:
Archer
2025-05-14 13:55:09 +08:00
committed by GitHub
parent bd93f28d6f
commit cba8f773fe
34 changed files with 227 additions and 93 deletions

View File

@@ -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 configinit vector databaseinit 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) {

View File

@@ -218,47 +218,48 @@ const CollectionChunkForm = ({ form }: { form: UseFormReturn<CollectionChunkForm
gridTemplateColumns={'repeat(2, 1fr)'}
/>
</Box>
{trainingType === DatasetCollectionDataProcessModeEnum.chunk && (
<Box mt={6}>
<Box fontSize={'sm'} mb={2} color={'myGray.600'}>
{t('dataset:enhanced_indexes')}
{trainingType === DatasetCollectionDataProcessModeEnum.chunk &&
feConfigs?.show_dataset_enhance !== false && (
<Box mt={6}>
<Box fontSize={'sm'} mb={2} color={'myGray.600'}>
{t('dataset:enhanced_indexes')}
</Box>
<HStack gap={[3, 7]}>
<HStack flex={'1'} spacing={1}>
<MyTooltip label={!feConfigs?.isPlus ? t('common:commercial_function_tip') : ''}>
<Checkbox
isDisabled={!feConfigs?.isPlus}
isChecked={autoIndexes}
{...register('autoIndexes')}
>
<FormLabel>{t('dataset:auto_indexes')}</FormLabel>
</Checkbox>
</MyTooltip>
<QuestionTip label={t('dataset:auto_indexes_tips')} />
</HStack>
<HStack flex={'1'} spacing={1}>
<MyTooltip
label={
!feConfigs?.isPlus
? t('common:commercial_function_tip')
: !datasetDetail?.vlmModel
? t('common:error_vlm_not_config')
: ''
}
>
<Checkbox
isDisabled={!feConfigs?.isPlus || !datasetDetail?.vlmModel}
isChecked={imageIndex}
{...register('imageIndex')}
>
<FormLabel>{t('dataset:image_auto_parse')}</FormLabel>
</Checkbox>
</MyTooltip>
<QuestionTip label={t('dataset:image_auto_parse_tips')} />
</HStack>
</HStack>
</Box>
<HStack gap={[3, 7]}>
<HStack flex={'1'} spacing={1}>
<MyTooltip label={!feConfigs?.isPlus ? t('common:commercial_function_tip') : ''}>
<Checkbox
isDisabled={!feConfigs?.isPlus}
isChecked={autoIndexes}
{...register('autoIndexes')}
>
<FormLabel>{t('dataset:auto_indexes')}</FormLabel>
</Checkbox>
</MyTooltip>
<QuestionTip label={t('dataset:auto_indexes_tips')} />
</HStack>
<HStack flex={'1'} spacing={1}>
<MyTooltip
label={
!feConfigs?.isPlus
? t('common:commercial_function_tip')
: !datasetDetail?.vlmModel
? t('common:error_vlm_not_config')
: ''
}
>
<Checkbox
isDisabled={!feConfigs?.isPlus || !datasetDetail?.vlmModel}
isChecked={imageIndex}
{...register('imageIndex')}
>
<FormLabel>{t('dataset:image_auto_parse')}</FormLabel>
</Checkbox>
</MyTooltip>
<QuestionTip label={t('dataset:image_auto_parse_tips')} />
</HStack>
</HStack>
</Box>
)}
)}
<Box mt={6}>
<Box fontSize={'sm'} mb={2} color={'myGray.600'}>
{t('dataset:params_setting')}

View File

@@ -1,3 +1,4 @@
'use client';
import React from 'react';
import ApiKeyTable from '@/components/support/apikey/Table';
import { useTranslation } from 'next-i18next';

View File

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

View File

@@ -1,3 +1,4 @@
'use client';
import React, { useCallback, useEffect, useMemo } from 'react';
import {
Box,

View File

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

View File

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

View File

@@ -1,3 +1,4 @@
'use client';
import React from 'react';
import {
Grid,

View File

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

View File

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

View File

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

View File

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

View File

@@ -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({

View File

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

View File

@@ -1,3 +1,4 @@
'use client';
import React, { useEffect } from 'react';
import { Box } from '@chakra-ui/react';
import dynamic from 'next/dynamic';

View File

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

View File

@@ -1,3 +1,4 @@
'use client';
import DashboardContainer from '@/pageComponents/dashboard/Container';
import PluginCard from '@/pageComponents/dashboard/SystemPlugin/ToolCard';

View File

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

View File

@@ -1,3 +1,4 @@
'use client';
import { serviceSideProps } from '@/web/common/i18n/utils';
import React, { useState } from 'react';
import DashboardContainer from '@/pageComponents/dashboard/Container';

View File

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

View File

@@ -1,3 +1,4 @@
'use client';
import React from 'react';
import { useRouter } from 'next/router';
import { Box, Flex, type FlexProps } from '@chakra-ui/react';

View File

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

View File

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

View File

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